1#ifndef vtkWidgetTestingMacros_h
2#define vtkWidgetTestingMacros_h
27#define EXERCISE_BASIC_OBJECT_METHODS(object) \
30 if (object == nullptr) \
32 std::cerr << "EXERCISE_BASIC_OBJECT_METHODS( with nullptr object )" << std::endl; \
33 return EXIT_FAILURE; \
35 object->Print(std::cout); \
36 std::cout << "Name of Class = " << object->GetClassName() << std::endl; \
37 std::cout << "Name of Superclass = " << object->Superclass::GetClassName() << std::endl; \
41#define TEST_SET_GET_BOOLEAN(object, variable) \
44 object->Set##variable(false); \
45 object->Set##variable(true); \
46 if (object->Get##variable() != 1) \
48 std::cerr << "Error in Set/Get" #variable << ", Get" #variable << " is " \
49 << object->Get##variable() << " instead of 1" << std::endl; \
50 return EXIT_FAILURE; \
52 object->Set##variable(false); \
53 if (object->Get##variable() != 0) \
55 std::cerr << "Error in Set/Get" #variable << ", Get" #variable << " is " \
56 << object->Get##variable() << " instead of 0" << std::endl; \
57 return EXIT_FAILURE; \
59 object->variable##On(); \
60 if (object->Get##variable() != 1) \
62 std::cerr << "Error in On/Get" #variable << ", Get" #variable << " is " \
63 << object->Get##variable() << " instead of 1" << std::endl; \
64 return EXIT_FAILURE; \
66 object->variable##Off(); \
67 if (object->Get##variable() != 0) \
69 std::cerr << "Error in Off/Get" #variable << ", Get" #variable << " is " \
70 << object->Get##variable() << " instead of 0" << std::endl; \
71 return EXIT_FAILURE; \
77#define TEST_SET_GET_INT(object, variable, value) \
80 object->Set##variable(value); \
81 if (object->Get##variable() != value) \
83 std::cerr << "Error in Set/Get" #variable << " using value " << value << std::endl; \
84 return EXIT_FAILURE; \
92#define TEST_SET_GET_INT_RANGE(object, variable, min, max) \
96 int val = min - epsilon; \
97 TEST_SET_GET_INT(object, variable, val); \
99 TEST_SET_GET_INT(object, variable, val); \
100 val = min + epsilon; \
101 TEST_SET_GET_INT(object, variable, val); \
102 val = (min + max) / 2; \
103 TEST_SET_GET_INT(object, variable, val); \
104 val = max - epsilon; \
105 TEST_SET_GET_INT(object, variable, val); \
107 TEST_SET_GET_INT(object, variable, val); \
108 val = max + epsilon; \
109 TEST_SET_GET_INT(object, variable, val); \
114#define TEST_SET_GET_DOUBLE(object, variable, value) \
117 object->Set##variable(value); \
118 if (object->Get##variable() != value) \
120 std::cerr << "Error in Set/Get" #variable << " using value '" << value << "', got '" \
121 << object->Get##variable() << "'" << std::endl; \
122 return EXIT_FAILURE; \
130#define TEST_SET_GET_DOUBLE_RANGE(object, variable, min, max) \
133 double epsilon = 1.0; \
134 double val = min - epsilon; \
135 TEST_SET_GET_DOUBLE(object, variable, val); \
137 TEST_SET_GET_DOUBLE(object, variable, val); \
138 val = min + epsilon; \
139 TEST_SET_GET_DOUBLE(object, variable, val); \
140 val = (min + max) / 2.0; \
141 TEST_SET_GET_DOUBLE(object, variable, val); \
142 val = max - epsilon; \
143 TEST_SET_GET_DOUBLE(object, variable, val); \
145 TEST_SET_GET_DOUBLE(object, variable, val); \
146 val = max + epsilon; \
147 TEST_SET_GET_DOUBLE(object, variable, val); \
152#define TEST_SET_GET_VECTOR3_DOUBLE(object, variable, x, y, z) \
155 object->Set##variable(x, y, z); \
156 double* val = object->Get##variable(); \
157 if (val == nullptr || val[0] != x || val[1] != y || val[2] != z) \
159 std::cerr << "Error in Set/Get" #variable << std::endl; \
160 return EXIT_FAILURE; \
166#define TEST_SET_GET_VECTOR2(object, variable, x, y) \
169 object->Set##variable(x, y); \
170 int* val = object->Get##variable(); \
171 if (val == nullptr || val[0] != x || val[1] != y) \
173 std::cerr << "Error in Set/Get" #variable << std::endl; \
174 return EXIT_FAILURE; \
183#define TEST_SET_GET_VECTOR2_INT_RANGE(object, variable, min, max) \
187 TEST_SET_GET_VECTOR2(object, variable, min - epsilon, min - epsilon); \
188 TEST_SET_GET_VECTOR2(object, variable, min, min); \
189 TEST_SET_GET_VECTOR2(object, variable, min + epsilon, min + epsilon); \
190 int half = (min + max / 2); \
191 TEST_SET_GET_VECTOR2(object, variable, half, half); \
192 TEST_SET_GET_VECTOR2(object, variable, max - epsilon, max - epsilon); \
193 TEST_SET_GET_VECTOR2(object, variable, max, max); \
194 TEST_SET_GET_VECTOR2(object, variable, max + epsilon, max + epsilon); \
202#define TEST_SET_GET_VECTOR2_DOUBLE_RANGE(object, variable, min, max) \
205 double epsilon = 1.0; \
206 TEST_SET_GET_VECTOR2(object, variable, min - epsilon, min - epsilon); \
207 TEST_SET_GET_VECTOR2(object, variable, min, min); \
208 TEST_SET_GET_VECTOR2(object, variable, min + epsilon, min + epsilon); \
209 double half = (min + max / 2.0); \
210 TEST_SET_GET_VECTOR2(object, variable, half, half); \
211 TEST_SET_GET_VECTOR2(object, variable, max - epsilon, max - epsilon); \
212 TEST_SET_GET_VECTOR2(object, variable, max, max); \
213 TEST_SET_GET_VECTOR2(object, variable, max + epsilon, max + epsilon); \
221#define TEST_SET_GET_VECTOR3_DOUBLE_RANGE(object, variable, min, max) \
224 double epsilon = 1.0; \
225 TEST_SET_GET_VECTOR3_DOUBLE(object, variable, min - epsilon, min - epsilon, min - epsilon); \
226 TEST_SET_GET_VECTOR3_DOUBLE(object, variable, min, min, min); \
227 TEST_SET_GET_VECTOR3_DOUBLE(object, variable, min + epsilon, min + epsilon, min + epsilon); \
228 double half = (min + max / 2.0); \
229 TEST_SET_GET_VECTOR3_DOUBLE(object, variable, half, half, half); \
230 TEST_SET_GET_VECTOR3_DOUBLE(object, variable, max - epsilon, max - epsilon, max - epsilon); \
231 TEST_SET_GET_VECTOR3_DOUBLE(object, variable, max, max, max); \
232 TEST_SET_GET_VECTOR3_DOUBLE(object, variable, max + epsilon, max + epsilon, max + epsilon); \
236#define TEST_SET_GET_STRING(object, variable) \
239 const char* originalStringPointer = object->Get##variable(); \
240 std::string originalString; \
241 if (originalStringPointer != nullptr) \
243 originalString = originalStringPointer; \
245 object->Set##variable("testing with a const char"); \
246 if (strcmp(object->Get##variable(), "testing with a const char") != 0) \
248 std::cerr << "Error in Set/Get" #variable << " with a string literal" << std::endl; \
249 return EXIT_FAILURE; \
251 std::string string1 = "testingIsGood"; \
252 object->Set##variable(string1.c_str()); \
253 if (object->Get##variable() != string1) \
255 std::cerr << "Error in Set/Get" #variable << std::endl; \
256 return EXIT_FAILURE; \
258 std::string string2 = "moreTestingIsBetter"; \
259 object->Set##variable(string2.c_str()); \
260 if (object->Get##variable() != string2) \
262 std::cerr << "Error in Set/Get" #variable << std::endl; \
263 return EXIT_FAILURE; \
265 if (originalStringPointer != nullptr) \
267 object->Set##variable(originalString.c_str()); \
271 object->Set##variable(nullptr); \
276#define TEST_SET_GET_CHAR(object, variable) \
279 const char originalChar = object->Get##variable(); \
280 object->Set##variable('t'); \
281 if (object->Get##variable() != 't') \
283 std::cerr << "Error in Set/Get" #variable << " with a literal 't'" << std::endl; \
284 return EXIT_FAILURE; \
286 object->Set##variable('3'); \
287 if (object->Get##variable() != '3') \
289 std::cerr << "Error in Set/Get" #variable << " with a literal '3'" << std::endl; \
290 return EXIT_FAILURE; \
292 object->Set##variable(originalChar); \
296#define EXERCISE_BASIC_INTERACTOR_OBSERVER_METHODS(object) \
299 EXERCISE_BASIC_OBJECT_METHODS(object); \
300 vtkSmartPointer<vtkRenderer> ren1 = vtkSmartPointer<vtkRenderer>::New(); \
301 vtkSmartPointer<vtkCamera> cam1 = vtkSmartPointer<vtkCamera>::New(); \
302 ren1->SetActiveCamera(cam1); \
303 vtkSmartPointer<vtkRenderWindow> renWin = vtkSmartPointer<vtkRenderWindow>::New(); \
304 renWin->SetMultiSamples(0); \
305 renWin->AddRenderer(ren1); \
306 if (object->GetInteractor() != nullptr) \
308 std::cout << "Object has an interactor already defined." << std::endl; \
310 vtkSmartPointer<vtkRenderWindowInteractor> iren = \
311 vtkSmartPointer<vtkRenderWindowInteractor>::New(); \
312 iren->SetRenderWindow(renWin); \
313 object->SetInteractor(iren); \
314 if (object->GetInteractor() != iren) \
316 std::cerr << "Error in Set/GetInteractor" << std::endl; \
317 return EXIT_FAILURE; \
319 if (object->GetDefaultRenderer() != nullptr) \
321 std::cout << "Object has default renderer already defined." << std::endl; \
324 vtkSmartPointer<vtkRenderer> ren = vtkSmartPointer<vtkRenderer>::New(); \
325 renWin->AddRenderer(ren); \
326 object->SetDefaultRenderer(ren); \
327 if (object->GetDefaultRenderer() != ren) \
329 std::cerr << "Error in Set/GetDefaultRenderer, default renderer is " \
330 << (object->GetDefaultRenderer() == nullptr ? "nullptr" : "not null") \
332 return EXIT_FAILURE; \
334 object->SetCurrentRenderer(ren); \
335 if (object->GetCurrentRenderer() != ren) \
337 std::cerr << "Get current renderer failed." << std::endl; \
340 iren->Initialize(); \
344 object->CreateDefaultRepresentation(); \
345 TEST_SET_GET_BOOLEAN(object, Enabled); \
347 if (!object->GetEnabled()) \
349 std::cerr << "Error in On" << std::endl; \
350 return EXIT_FAILURE; \
353 if (object->GetEnabled()) \
355 std::cerr << "Error in Off" << std::endl; \
356 return EXIT_FAILURE; \
359 TEST_SET_GET_DOUBLE(object, Priority, 0.0); \
360 float min = object->GetPriorityMinValue(); \
361 float max = object->GetPriorityMaxValue(); \
362 std::cout << "Priority min = " << min << ", max = " << max << std::endl; \
363 TEST_SET_GET_DOUBLE(object, Priority, 0.1f); \
364 TEST_SET_GET_DOUBLE(object, Priority, 0.5f); \
365 TEST_SET_GET_DOUBLE(object, Priority, 0.9f); \
366 TEST_SET_GET_DOUBLE(object, Priority, 1.0f); \
368 TEST_SET_GET_BOOLEAN(object, KeyPressActivation); \
369 TEST_SET_GET_CHAR(object, KeyPressActivationValue); \
375 double x = 1.0, y = 1.0, z = 1.0; \
376 object->ComputeDisplayToWorld(ren, x, y, z, worldPt); \
377 std::cout << "Display " << x << "," << y << "," << z << " to world = " << worldPt[0] << "," \
378 << worldPt[1] << "," << worldPt[2] << "," << worldPt[3] << std::endl; \
379 double displayPt[3]; \
380 object->ComputeWorldToDisplay(ren, x, y, z, displayPt); \
381 std::cout << "World " << x << "," << y << "," << z << " to display = " << displayPt[0] \
382 << "," << displayPt[1] << "," << displayPt[2] << std::endl; \
385 object->GrabFocus(nullptr, nullptr); \
386 object->ReleaseFocus(); \
390#define EXERCISE_BASIC_ABSTRACT_METHODS(object) \
393 EXERCISE_BASIC_INTERACTOR_OBSERVER_METHODS(object); \
394 TEST_SET_GET_BOOLEAN(object, ProcessEvents); \
395 if (object->GetEventTranslator() == nullptr) \
397 std::cerr << "Error getting event translator, is null." << std::endl; \
398 return EXIT_FAILURE; \
400 object->CreateDefaultRepresentation(); \
402 if (object->GetParent() != nullptr) \
404 std::cerr << "Error, parent is not null." << std::endl; \
405 return EXIT_FAILURE; \
410#define EXERCISE_BASIC_BORDER_METHODS(object) \
413 EXERCISE_BASIC_ABSTRACT_METHODS(object); \
414 TEST_SET_GET_BOOLEAN(object, Selectable); \
415 TEST_SET_GET_BOOLEAN(object, Resizable); \
419#define EXERCISE_BASIC_HOVER_METHODS(object) \
422 EXERCISE_BASIC_ABSTRACT_METHODS(object); \
423 TEST_SET_GET_INT(object, TimerDuration, 1); \
424 TEST_SET_GET_INT(object, TimerDuration, 2); \
425 TEST_SET_GET_INT(object, TimerDuration, 50000); \
426 TEST_SET_GET_INT(object, TimerDuration, 99999); \
427 TEST_SET_GET_INT(object, TimerDuration, 100000); \
431#define EXERCISE_BASIC_PROP_METHODS(className, object) \
434 EXERCISE_BASIC_OBJECT_METHODS(object); \
435 vtkSmartPointer<vtkPropCollection> propCollection = vtkSmartPointer<vtkPropCollection>::New(); \
436 object->GetActors(propCollection); \
437 object->GetActors2D(propCollection); \
438 object->GetVolumes(propCollection); \
440 TEST_SET_GET_BOOLEAN(object, Visibility); \
441 TEST_SET_GET_BOOLEAN(object, Pickable); \
442 TEST_SET_GET_BOOLEAN(object, Dragable); \
443 TEST_SET_GET_BOOLEAN(object, UseBounds); \
444 object->UseBoundsOff(); \
448 vtkMTimeType redrawMTime = object->GetRedrawMTime(); \
449 std::cout << "Redraw Modified Time = " << redrawMTime << std::endl; \
451 vtkSmartPointer<className> copyProp = vtkSmartPointer<className>::New(); \
452 object->ShallowCopy(copyProp); \
454 object->InitPathTraversal(); \
456 vtkSmartPointer<vtkAssemblyPath> assemblyPath = vtkSmartPointer<vtkAssemblyPath>::New(); \
457 assemblyPath = object->GetNextPath(); \
458 std::cout << "Number of paths = " << object->GetNumberOfPaths() << std::endl; \
460 vtkSmartPointer<vtkMatrix4x4> mat = vtkSmartPointer<vtkMatrix4x4>::New(); \
461 object->PokeMatrix(mat); \
462 mat = object->GetMatrix(); \
463 if (mat == nullptr) \
465 std::cout << "No matrix." << std::endl; \
468 vtkSmartPointer<vtkInformation> info = vtkSmartPointer<vtkInformation>::New(); \
469 info = object->GetPropertyKeys(); \
470 if (info != nullptr) \
472 info->Print(std::cout); \
476 std::cout << "No property keys" << std::endl; \
478 object->SetPropertyKeys(info); \
479 std::cout << "Has null required keys? " << object->HasKeys(nullptr) << std::endl; \
481 std::cout << "Skipping the internal render calls, requires vtkViewPort. Testing get macros." \
483 std::cout << "HasTranslucentPolygonalGeometry = " << object->HasTranslucentPolygonalGeometry() \
485 std::cout << "AllocatedRenderTime = " << object->GetAllocatedRenderTime() << std::endl; \
486 std::cout << "RenderTimeMultiplier = " << object->GetRenderTimeMultiplier() << std::endl; \
487 std::cout << "SupportsSelection = " << object->GetSupportsSelection() << std::endl; \
488 std::cout << "NumberOfConsumers = " << object->GetNumberOfConsumers() << std::endl; \
491#define NOT_DEFINED_CONSUMERS_FAIL() \
494 vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New(); \
495 object->AddConsumer(actor); \
496 if (object->IsConsumer(actor) != 1) \
498 std::cerr << "Failed IsConsumer check for a valid consumer." << std::endl; \
499 return EXIT_FAILURE; \
501 if (object->IsConsumer(nullptr) != 0) \
503 std::cerr << "Failed IsConsumer check for a null consumer." << std::endl; \
504 return EXIT_FAILURE; \
506 vtkSmartPointer<vtkActor> actor2 = object->GetConsumer(0); \
507 if (actor2 != actor) \
509 std::cerr << "Failed get consumer check for a valid consumer." << std::endl; \
510 return EXIT_FAILURE; \
512 object->RemoveConsumer(actor); \
513 actor2 = object->GetConsumer(0); \
514 if (actor2 != nullptr) \
516 std::cerr << "Failed get consumer check for an invalid consumer number 0." << std::endl; \
517 return EXIT_FAILURE; \
526#define EXERCISE_BASIC_REPRESENTATION_METHODS(className, object) \
527 std::cout << "Creating a renderer and a default widget..." << std::endl; \
528 vtkSmartPointer<vtkCamera> cam1 = vtkSmartPointer<vtkCamera>::New(); \
529 vtkSmartPointer<vtkRenderer> ren1 = vtkSmartPointer<vtkRenderer>::New(); \
530 ren1->SetActiveCamera(cam1); \
531 vtkSmartPointer<vtkRenderWindow> renWin = vtkSmartPointer<vtkRenderWindow>::New(); \
532 renWin->SetMultiSamples(0); \
533 renWin->AddRenderer(ren1); \
534 vtkSmartPointer<vtkRenderWindowInteractor> iren = \
535 vtkSmartPointer<vtkRenderWindowInteractor>::New(); \
536 iren->SetRenderWindow(renWin); \
538 object->SetRenderer(ren1); \
539 vtkSmartPointer<vtkRenderer> ren2 = object->GetRenderer(); \
542 std::cerr << "Failure in GetRenderer." << std::endl; \
543 return EXIT_FAILURE; \
546 double bounds[6] = { -1.0, 0.0, -10.0, 10.0, -5.0, 2.0 }; \
547 object->PlaceWidget(bounds); \
548 const double* bounds2 = object->GetBounds(); \
549 if (bounds2 == nullptr) \
551 std::cout << "GetBounds is null." << std::endl; \
555 std::cout << "Bounds = " << bounds[0] << "," << bounds[1] << "," << bounds[2] << "," \
556 << bounds[3] << "," << bounds[4] << "," << bounds[5] << std::endl; \
559 double eventPos[2] = { 10.0, 10.0 }; \
560 object->StartWidgetInteraction(eventPos); \
561 object->WidgetInteraction(eventPos); \
562 object->EndWidgetInteraction(eventPos); \
563 std::cout << "InteractionState computed to be = " << object->ComputeInteractionState(10, 10, 0) \
565 std::cout << "GetInteractionState = " << object->GetInteractionState() << std::endl; \
566 object->Highlight(0); \
567 object->Highlight(1); \
569 TEST_SET_GET_DOUBLE_RANGE(object, PlaceFactor, 1.01, 1000.0); \
570 TEST_SET_GET_DOUBLE_RANGE(object, HandleSize, 1.002, 999.0); \
571 TEST_SET_GET_BOOLEAN(object, NeedToRender); \
573 std::cout << "Trying to get back to init state for further testing." << std::endl; \
574 object->SetPlaceFactor(0.5); \
575 object->SetHandleSize(0.05); \
576 std::cout << "Done basic rep methods" << std::endl; \
577 EXERCISE_BASIC_PROP_METHODS(className, object);
580#define EXERCISE_BASIC_ANGLE_REPRESENTATION_METHODS(className, object) \
583 vtkSmartPointer<vtkPointHandleRepresentation2D> phandle0 = \
584 vtkSmartPointer<vtkPointHandleRepresentation2D>::New(); \
585 object->SetHandleRepresentation(phandle0); \
586 object->InstantiateHandleRepresentation(); \
588 std::cout << "GetAngle = " << object->GetAngle() << std::endl; \
591 object->GetPoint1WorldPosition(pos); \
592 std::cout << "GetPoint1WorldPosition = " << pos[0] << ", " << pos[1] << ", " << pos[2] \
594 object->GetCenterWorldPosition(pos); \
595 std::cout << "GetCenterWorldPosition = " << pos[0] << ", " << pos[1] << ", " << pos[2] \
597 object->GetPoint2WorldPosition(pos); \
598 std::cout << "GetPoint2WorldPosition = " << pos[0] << ", " << pos[1] << ", " << pos[2] \
605 object->SetCenterDisplayPosition(pos2); \
606 object->GetCenterDisplayPosition(pos); \
607 if (pos[0] != pos2[0] || pos[0] != pos2[0] || pos[0] != pos2[0]) \
609 std::cerr << "Failed to SetCenterDisplayPosition to " << pos2[0] << ", " << pos2[1] << ", " \
610 << pos2[2] << ", instead got " << pos[0] << ", " << pos[1] << ", " << pos[2] \
612 return EXIT_FAILURE; \
616 object->SetPoint1DisplayPosition(pos2); \
617 object->GetPoint1DisplayPosition(pos); \
618 if (pos[0] != pos2[0] || pos[0] != pos2[0] || pos[0] != pos2[0]) \
620 std::cerr << "Failed to SetPoint1DisplayPosition to " << pos2[0] << ", " << pos2[1] << ", " \
621 << pos2[2] << ", instead got " << pos[0] << ", " << pos[1] << ", " << pos[2] \
623 return EXIT_FAILURE; \
627 object->SetPoint2DisplayPosition(pos2); \
628 object->GetPoint2DisplayPosition(pos); \
629 if (pos[0] != pos2[0] || pos[0] != pos2[0] || pos[0] != pos2[0]) \
631 std::cerr << "Failed to SetPoint2DisplayPosition to " << pos2[0] << ", " << pos2[1] << ", " \
632 << pos2[2] << ", instead got " << pos[0] << ", " << pos[1] << ", " << pos[2] \
634 return EXIT_FAILURE; \
637 vtkSmartPointer<vtkPointHandleRepresentation2D> phandle = \
638 vtkSmartPointer<vtkPointHandleRepresentation2D>::New(); \
639 object->SetHandleRepresentation(phandle); \
640 object->InstantiateHandleRepresentation(); \
642 vtkSmartPointer<vtkHandleRepresentation> handleRep = nullptr; \
643 handleRep = object->GetPoint1Representation(); \
644 handleRep = object->GetPoint2Representation(); \
645 handleRep = object->GetCenterRepresentation(); \
647 TEST_SET_GET_INT_RANGE(object, Tolerance, 2, 99); \
648 TEST_SET_GET_STRING(object, LabelFormat); \
649 TEST_SET_GET_BOOLEAN(object, Ray1Visibility); \
650 TEST_SET_GET_BOOLEAN(object, Ray2Visibility); \
651 TEST_SET_GET_BOOLEAN(object, ArcVisibility); \
653 double e[2] = { 5.0, 1.0 }; \
654 object->CenterWidgetInteraction(e); \
655 EXERCISE_BASIC_REPRESENTATION_METHODS(className, object); \
659#define EXERCISE_BASIC_BORDER_REPRESENTATION_METHODS(className, object) \
662 EXERCISE_BASIC_REPRESENTATION_METHODS(className, object); \
664 double pos[2] = { 10.0, 11.0 }; \
665 double* pos2 = nullptr; \
666 object->SetPosition(pos); \
667 pos2 = object->GetPosition(); \
668 if (pos2 == nullptr) \
670 std::cerr << "Failure in Get/Set Position pos, got null position back." << std::endl; \
671 return EXIT_FAILURE; \
673 else if (pos2[0] != pos[0] || pos2[1] != pos[1]) \
675 std::cerr << "Failure in Get/Set Position pos, expected " << pos[0] << ", " << pos[1] \
676 << ", instead got " << pos2[0] << ", " << pos2[1] << std::endl; \
677 return EXIT_FAILURE; \
681 std::cout << "Set Position to " << pos2[0] << ", " << pos2[1] << std::endl; \
685 object->SetPosition(pos[0], pos[1]); \
686 pos2 = object->GetPosition(); \
687 if (pos2 == nullptr || pos2[0] != pos[0] || pos2[1] != pos[1]) \
689 std::cerr << "Failure in Get/Set Position x,y, expected " << pos[0] << ", " << pos[1] \
690 << ", instead got " << pos2[0] << ", " << pos2[1] << std::endl; \
691 return EXIT_FAILURE; \
693 vtkSmartPointer<vtkCoordinate> coord = object->GetPositionCoordinate(); \
694 pos2 = coord->GetValue(); \
695 if (pos2 == nullptr || pos2[0] != pos[0] || pos2[1] != pos[1]) \
697 std::cerr << "Failure in Get/ Coordinate, expected " << pos[0] << ", " << pos[1] \
698 << ", instead got " << pos2[0] << ", " << pos2[1] << std::endl; \
699 return EXIT_FAILURE; \
703 object->SetPosition2(pos); \
704 pos2 = object->GetPosition2(); \
705 if (pos2 == nullptr || pos2[0] != pos[0] || pos2[1] != pos[1]) \
707 std::cerr << "Failure in Get/Set Position2 pos, expected " << pos[0] << ", " << pos[1] \
708 << ", instead got " << pos2[0] << ", " << pos2[1] << std::endl; \
709 return EXIT_FAILURE; \
712 object->SetPosition2(pos[0], pos[1]); \
713 pos2 = object->GetPosition2(); \
714 if (pos2 == nullptr || pos2[0] != pos[0] || pos2[1] != pos[1]) \
716 std::cerr << "Failure in Get/Set Position2 x,y, expected " << pos[0] << ", " << pos[1] \
717 << ", instead got " << pos2[0] << ", " << pos2[1] << std::endl; \
718 return EXIT_FAILURE; \
720 coord = object->GetPosition2Coordinate(); \
721 pos2 = coord->GetValue(); \
722 if (pos2 == nullptr || pos2[0] != pos[0] || pos2[1] != pos[1]) \
724 std::cerr << "Failure in Get/ Coordinate 2, expected " << pos[0] << ", " << pos[1] \
725 << ", instead got " << pos2[0] << ", " << pos2[1] << std::endl; \
726 return EXIT_FAILURE; \
729 TEST_SET_GET_INT(object, ShowBorder, 0); \
730 TEST_SET_GET_INT(object, ShowBorder, 1); \
731 TEST_SET_GET_INT(object, ShowBorder, 2); \
732 object->SetShowBorderToOff(); \
733 object->SetShowBorderToOn(); \
734 object->SetShowBorderToActive(); \
736 vtkSmartPointer<vtkProperty2D> borderProperty = object->GetBorderProperty(); \
738 TEST_SET_GET_BOOLEAN(object, ProportionalResize); \
740 TEST_SET_GET_VECTOR2_INT_RANGE(object, MinimumSize, 0, 100); \
741 TEST_SET_GET_VECTOR2_INT_RANGE(object, MaximumSize, 0, 100); \
742 TEST_SET_GET_INT_RANGE(object, Tolerance, 2, 9); \
744 double* selPoint = object->GetSelectionPoint(); \
747 std::cout << "Selection Point = " << selPoint[0] << ", " << selPoint[1] << std::endl; \
750 TEST_SET_GET_BOOLEAN(object, Moving); \
753 object->GetSize(size); \
754 std::cout << "Size = " << size[0] << ", " << size[1] << std::endl; \
756 int interactionState = object->ComputeInteractionState(10, 10); \
757 std::cout << "Interaction state = " << interactionState << std::endl; \
761#define EXERCISE_BASIC_IMPLICIT_PLANE_REPRESENTATION_METHODS(className, object) \
764 EXERCISE_BASIC_REPRESENTATION_METHODS(className, object); \
766 TEST_SET_GET_VECTOR3_DOUBLE_RANGE(node1, Origin, -100, 100); \
767 TEST_SET_GET_VECTOR3_DOUBLE_RANGE(node1, Normal, -1, 1); \
768 TEST_SET_GET_BOOLEAN(node1, NormalToXAxis); \
769 TEST_SET_GET_BOOLEAN(node1, NormalToYAxis); \
770 TEST_SET_GET_BOOLEAN(node1, NormalToZAxis); \
771 TEST_SET_GET_BOOLEAN(node1, Tubing); \
772 TEST_SET_GET_BOOLEAN(node1, DrawPlane); \
773 TEST_SET_GET_BOOLEAN(node1, OutlineTranslation); \
774 TEST_SET_GET_BOOLEAN(node1, OutsideBounds); \
775 TEST_SET_GET_BOOLEAN(node1, ScaleEnabled); \
779#define TEST_SET_GET_PROPERTY(object, variable) \
782 vtkSmartPointer<vtkProperty> prop1 = vtkSmartPointer<vtkProperty>::New(); \
783 double colour[3] = { 0.2, 0.3, 0.4 }; \
784 prop1->SetColor(colour); \
785 node1->Set##variable(prop1); \
786 vtkSmartPointer<vtkProperty> prop = node1->Get##variable(); \
789 std::cerr << "Got null variable property back after setting it!" << std::endl; \
790 return EXIT_FAILURE; \
792 double* col = prop->GetColor(); \
795 std::cerr << "Got null colour back!" << std::endl; \
796 return EXIT_FAILURE; \
798 if (col[0] != colour[0] || col[1] != colour[1] || col[2] != colour[2]) \
800 std::cerr << "Got wrong colour back after setting it! Expected " << colour[0] << ", " \
801 << colour[1] << ", " << colour[2] << ", but got " << col[0] << ", " << col[1] \
802 << ", " << col[2] << std::endl; \
803 return EXIT_FAILURE; \
810#define EXERCISE_BASIC_HANDLE_REPRESENTATION_METHODS(className, object) \
813 EXERCISE_BASIC_REPRESENTATION_METHODS(className, object); \
815 double dpos[3], wpos[3]; \
825 std::cout << "Testing SetWorldPosition" << std::endl; \
827 object->SetWorldPosition(wpos); \
828 std::cout << "Testing GetWorldPosition" << std::endl; \
829 object->GetWorldPosition(pos2); \
830 if (pos2[0] != wpos[0] || pos2[1] != wpos[1] || pos2[2] != wpos[2]) \
832 std::cerr << "Failure in Get WorldPosition pos2, expected " << wpos[0] << ", " << wpos[1] \
833 << ", " << wpos[2] << ", instead got " << pos2[0] << ", " << pos2[1] << ", " \
834 << pos2[2] << std::endl; \
835 return EXIT_FAILURE; \
837 pos3 = object->GetWorldPosition(); \
840 std::cerr << "Failure in double * GetWorldPosition , expected " << wpos[0] << ", " \
841 << wpos[1] << ", " << wpos[2] << ", instead got a null pointer." << std::endl; \
842 return EXIT_FAILURE; \
844 if (pos3[0] != wpos[0] || pos3[1] != wpos[1] || pos3[2] != wpos[2]) \
846 std::cerr << "Failure in double * GetWorldyPosition , expected " << wpos[0] << ", " \
847 << wpos[1] << ", " << wpos[2] << ", instead got " << pos3[0] << ", " << pos3[1] \
848 << ", " << pos3[2] << std::endl; \
849 return EXIT_FAILURE; \
851 std::cout << "Done testing world position." << std::endl; \
853 std::cout << "Testing Set/Get Display Position" << std::endl; \
855 object->GetDisplayPosition(pos2); \
856 std::cout << "After GetDisplayPosition." << std::endl; \
857 object->SetDisplayPosition(dpos); \
858 std::cout << "After SetDisplayPosition" << std::endl; \
859 object->GetDisplayPosition(pos2); \
860 std::cout << "After GetDisplayPosition second time." << std::endl; \
861 if (pos2[0] != 0 || pos2[1] != 0) \
863 std::cerr << "Failure in GetDisplayPosition pos2, expected (0,0) instead got " << pos2[0] \
864 << ", " << pos2[1] << std::endl; \
865 return EXIT_FAILURE; \
867 pos3 = object->GetDisplayPosition(); \
871 << "Failure in double * GetDisplayPosition, expected (0,0) instead got a null pointer." \
873 return EXIT_FAILURE; \
875 if (pos3[0] != 0 || pos3[1] != 0) \
877 std::cerr << "Failure in double * GetDisplayPosition , expected (0,0) instead got " \
878 << pos3[0] << ", " << pos3[1] << std::endl; \
879 return EXIT_FAILURE; \
881 TEST_SET_GET_INT_RANGE(object, Tolerance, 2, 99); \
882 TEST_SET_GET_BOOLEAN(object, ActiveRepresentation); \
883 TEST_SET_GET_BOOLEAN(object, Constrained); \
885 vtkSmartPointer<vtkRenderer> ren3 = object->GetRenderer(); \
886 double posToCheck[3] = { 0.0, 0.0, 0.0 }; \
887 int flag = object->CheckConstraint(ren3, posToCheck); \
888 std::cout << "Check Constraint = " << flag << std::endl; \
890 std::cout << "MTime = " << object->GetMTime() << std::endl; \
892 vtkSmartPointer<vtkPointPlacer> pplacer = vtkSmartPointer<vtkPointPlacer>::New(); \
893 object->SetPointPlacer(pplacer); \
894 vtkSmartPointer<vtkPointPlacer> pplacer2 = object->GetPointPlacer(); \
895 if (pplacer2 != pplacer) \
897 std::cerr << "Error in Set/Get point placer." << std::endl; \
898 return EXIT_FAILURE; \
900 flag = object->CheckConstraint(ren3, posToCheck); \
901 std::cout << "Check Constraint after setting point placer = " << flag << std::endl; \
905#define EXERCISE_BASIC_ABSTRACT_POLYGONAL_HANDLE_REPRESENTATION3D_METHODS(className, object) \
908 EXERCISE_BASIC_HANDLE_REPRESENTATION_METHODS(className, object); \
910 vtkSmartPointer<vtkPolyData> pd = vtkSmartPointer<vtkPolyData>::New(); \
911 object->SetHandle(pd); \
912 vtkSmartPointer<vtkPolyData> pd2 = object->GetHandle(); \
913 if (pd2 == nullptr) \
915 std::cerr << "Error getting handle, null pointer." << std::endl; \
916 return EXIT_FAILURE; \
920 std::cerr << "Error getting handle, not the same as set." << std::endl; \
921 return EXIT_FAILURE; \
923 TEST_SET_GET_PROPERTY(object, Property); \
924 TEST_SET_GET_PROPERTY(object, SelectedProperty); \
926 vtkSmartPointer<vtkAbstractTransform> at = object->GetTransform(); \
928 TEST_SET_GET_BOOLEAN(object, LabelVisibility); \
929 TEST_SET_GET_STRING(object, LabelText); \
930 TEST_SET_GET_VECTOR3_DOUBLE_RANGE(object, LabelTextScale, 0.0, 10.0); \
932 vtkSmartPointer<vtkFollower> follower = object->GetLabelTextActor(); \
933 if (follower == nullptr) \
935 std::cout << "Follower is null." << std::endl; \
938 object->SetUniformScale(-1.0); \
939 object->SetUniformScale(0.0); \
940 object->SetUniformScale(1.0); \
941 object->SetUniformScale(35.44); \
943 TEST_SET_GET_BOOLEAN(object, HandleVisibility); \