|  | VTK
    9.0.1
    | 
 
 
 
Go to the documentation of this file.    1 #ifndef vtkWidgetTestingMacros_h 
    2 #define vtkWidgetTestingMacros_h 
   27 #define EXERCISE_BASIC_OBJECT_METHODS(object)                                                      \ 
   29     if (object == nullptr)                                                                         \ 
   31       std::cerr << "EXERCISE_BASIC_OBJECT_METHODS( with nullptr object )" << std::endl;            \ 
   32       return EXIT_FAILURE;                                                                         \ 
   34     object->Print(std::cout);                                                                      \ 
   35     std::cout << "Name of Class = " << object->GetClassName() << std::endl;                        \ 
   36     std::cout << "Name of Superclass = " << object->Superclass::GetClassName() << std::endl;       \ 
   40 #define TEST_SET_GET_BOOLEAN(object, variable)                                                     \ 
   41   object->Set##variable(false);                                                                    \ 
   42   object->Set##variable(true);                                                                     \ 
   43   if (object->Get##variable() != 1)                                                                \ 
   45     std::cerr << "Error in Set/Get" #variable << ", Get" #variable << " is "                       \ 
   46               << object->Get##variable() << " instead of 1" << std::endl;                          \ 
   47     return EXIT_FAILURE;                                                                           \ 
   49   object->Set##variable(false);                                                                    \ 
   50   if (object->Get##variable() != 0)                                                                \ 
   52     std::cerr << "Error in Set/Get" #variable << ", Get" #variable << " is "                       \ 
   53               << object->Get##variable() << " instead of 0" << std::endl;                          \ 
   54     return EXIT_FAILURE;                                                                           \ 
   56   object->variable##On();                                                                          \ 
   57   if (object->Get##variable() != 1)                                                                \ 
   59     std::cerr << "Error in On/Get" #variable << ", Get" #variable << " is "                        \ 
   60               << object->Get##variable() << " instead of 1" << std::endl;                          \ 
   61     return EXIT_FAILURE;                                                                           \ 
   63   object->variable##Off();                                                                         \ 
   64   if (object->Get##variable() != 0)                                                                \ 
   66     std::cerr << "Error in Off/Get" #variable << ", Get" #variable << " is "                       \ 
   67               << object->Get##variable() << " instead of 0" << std::endl;                          \ 
   68     return EXIT_FAILURE;                                                                           \ 
   73 #define TEST_SET_GET_INT(object, variable, value)                                                  \ 
   75     object->Set##variable(value);                                                                  \ 
   76     if (object->Get##variable() != value)                                                          \ 
   78       std::cerr << "Error in Set/Get" #variable << " using value " << value << std::endl;          \ 
   79       return EXIT_FAILURE;                                                                         \ 
   87 #define TEST_SET_GET_INT_RANGE(object, variable, min, max)                                         \ 
   90     int val = min - epsilon;                                                                       \ 
   91     TEST_SET_GET_INT(object, variable, val);                                                       \ 
   93     TEST_SET_GET_INT(object, variable, val);                                                       \ 
   94     val = min + epsilon;                                                                           \ 
   95     TEST_SET_GET_INT(object, variable, val);                                                       \ 
   96     val = (min + max) / 2;                                                                         \ 
   97     TEST_SET_GET_INT(object, variable, val);                                                       \ 
   98     val = max - epsilon;                                                                           \ 
   99     TEST_SET_GET_INT(object, variable, val);                                                       \ 
  101     TEST_SET_GET_INT(object, variable, val);                                                       \ 
  102     val = max + epsilon;                                                                           \ 
  103     TEST_SET_GET_INT(object, variable, val);                                                       \ 
  108 #define TEST_SET_GET_DOUBLE(object, variable, value)                                               \ 
  110     object->Set##variable(value);                                                                  \ 
  111     if (object->Get##variable() != value)                                                          \ 
  113       std::cerr << "Error in Set/Get" #variable << " using value '" << value << "', got '"         \ 
  114                 << object->Get##variable() << "'" << std::endl;                                    \ 
  115       return EXIT_FAILURE;                                                                         \ 
  123 #define TEST_SET_GET_DOUBLE_RANGE(object, variable, min, max)                                      \ 
  125     double epsilon = 1.0;                                                                          \ 
  126     double val = min - epsilon;                                                                    \ 
  127     TEST_SET_GET_DOUBLE(object, variable, val);                                                    \ 
  129     TEST_SET_GET_DOUBLE(object, variable, val);                                                    \ 
  130     val = min + epsilon;                                                                           \ 
  131     TEST_SET_GET_DOUBLE(object, variable, val);                                                    \ 
  132     val = (min + max) / 2.0;                                                                       \ 
  133     TEST_SET_GET_DOUBLE(object, variable, val);                                                    \ 
  134     val = max - epsilon;                                                                           \ 
  135     TEST_SET_GET_DOUBLE(object, variable, val);                                                    \ 
  137     TEST_SET_GET_DOUBLE(object, variable, val);                                                    \ 
  138     val = max + epsilon;                                                                           \ 
  139     TEST_SET_GET_DOUBLE(object, variable, val);                                                    \ 
  144 #define TEST_SET_GET_VECTOR3_DOUBLE(object, variable, x, y, z)                                     \ 
  146     object->Set##variable(x, y, z);                                                                \ 
  147     double* val = object->Get##variable();                                                         \ 
  148     if (val == nullptr || val[0] != x || val[1] != y || val[2] != z)                               \ 
  150       std::cerr << "Error in Set/Get" #variable << std::endl;                                      \ 
  151       return EXIT_FAILURE;                                                                         \ 
  157 #define TEST_SET_GET_VECTOR2(object, variable, x, y)                                               \ 
  159     object->Set##variable(x, y);                                                                   \ 
  160     int* val = object->Get##variable();                                                            \ 
  161     if (val == nullptr || val[0] != x || val[1] != y)                                              \ 
  163       std::cerr << "Error in Set/Get" #variable << std::endl;                                      \ 
  164       return EXIT_FAILURE;                                                                         \ 
  173 #define TEST_SET_GET_VECTOR2_INT_RANGE(object, variable, min, max)                                 \ 
  176     TEST_SET_GET_VECTOR2(object, variable, min - epsilon, min - epsilon);                          \ 
  177     TEST_SET_GET_VECTOR2(object, variable, min, min);                                              \ 
  178     TEST_SET_GET_VECTOR2(object, variable, min + epsilon, min + epsilon);                          \ 
  179     int half = (min + max / 2);                                                                    \ 
  180     TEST_SET_GET_VECTOR2(object, variable, half, half);                                            \ 
  181     TEST_SET_GET_VECTOR2(object, variable, max - epsilon, max - epsilon);                          \ 
  182     TEST_SET_GET_VECTOR2(object, variable, max, max);                                              \ 
  183     TEST_SET_GET_VECTOR2(object, variable, max + epsilon, max + epsilon);                          \ 
  191 #define TEST_SET_GET_VECTOR2_DOUBLE_RANGE(object, variable, min, max)                              \ 
  193     double epsilon = 1.0;                                                                          \ 
  194     TEST_SET_GET_VECTOR2(object, variable, min - epsilon, min - epsilon);                          \ 
  195     TEST_SET_GET_VECTOR2(object, variable, min, min);                                              \ 
  196     TEST_SET_GET_VECTOR2(object, variable, min + epsilon, min + epsilon);                          \ 
  197     double half = (min + max / 2.0);                                                               \ 
  198     TEST_SET_GET_VECTOR2(object, variable, half, half);                                            \ 
  199     TEST_SET_GET_VECTOR2(object, variable, max - epsilon, max - epsilon);                          \ 
  200     TEST_SET_GET_VECTOR2(object, variable, max, max);                                              \ 
  201     TEST_SET_GET_VECTOR2(object, variable, max + epsilon, max + epsilon);                          \ 
  209 #define TEST_SET_GET_VECTOR3_DOUBLE_RANGE(object, variable, min, max)                              \ 
  211     double epsilon = 1.0;                                                                          \ 
  212     TEST_SET_GET_VECTOR3_DOUBLE(object, variable, min - epsilon, min - epsilon, min - epsilon);    \ 
  213     TEST_SET_GET_VECTOR3_DOUBLE(object, variable, min, min, min);                                  \ 
  214     TEST_SET_GET_VECTOR3_DOUBLE(object, variable, min + epsilon, min + epsilon, min + epsilon);    \ 
  215     double half = (min + max / 2.0);                                                               \ 
  216     TEST_SET_GET_VECTOR3_DOUBLE(object, variable, half, half, half);                               \ 
  217     TEST_SET_GET_VECTOR3_DOUBLE(object, variable, max - epsilon, max - epsilon, max - epsilon);    \ 
  218     TEST_SET_GET_VECTOR3_DOUBLE(object, variable, max, max, max);                                  \ 
  219     TEST_SET_GET_VECTOR3_DOUBLE(object, variable, max + epsilon, max + epsilon, max + epsilon);    \ 
  223 #define TEST_SET_GET_STRING(object, variable)                                                      \ 
  225     const char* originalStringPointer = object->Get##variable();                                   \ 
  226     std::string originalString;                                                                    \ 
  227     if (originalStringPointer != nullptr)                                                          \ 
  229       originalString = originalStringPointer;                                                      \ 
  231     object->Set##variable("testing with a const char");                                            \ 
  232     if (strcmp(object->Get##variable(), "testing with a const char") != 0)                         \ 
  234       std::cerr << "Error in Set/Get" #variable << " with a string literal" << std::endl;          \ 
  235       return EXIT_FAILURE;                                                                         \ 
  237     std::string string1 = "testingIsGood";                                                         \ 
  238     object->Set##variable(string1.c_str());                                                        \ 
  239     if (object->Get##variable() != string1)                                                        \ 
  241       std::cerr << "Error in Set/Get" #variable << std::endl;                                      \ 
  242       return EXIT_FAILURE;                                                                         \ 
  244     std::string string2 = "moreTestingIsBetter";                                                   \ 
  245     object->Set##variable(string2.c_str());                                                        \ 
  246     if (object->Get##variable() != string2)                                                        \ 
  248       std::cerr << "Error in Set/Get" #variable << std::endl;                                      \ 
  249       return EXIT_FAILURE;                                                                         \ 
  251     if (originalStringPointer != nullptr)                                                          \ 
  253       object->Set##variable(originalString.c_str());                                               \ 
  257       object->Set##variable(nullptr);                                                              \ 
  262 #define TEST_SET_GET_CHAR(object, variable)                                                        \ 
  264     const char originalChar = object->Get##variable();                                             \ 
  265     object->Set##variable('t');                                                                    \ 
  266     if (object->Get##variable() != 't')                                                            \ 
  268       std::cerr << "Error in Set/Get" #variable << " with a literal 't'" << std::endl;             \ 
  269       return EXIT_FAILURE;                                                                         \ 
  271     object->Set##variable('3');                                                                    \ 
  272     if (object->Get##variable() != '3')                                                            \ 
  274       std::cerr << "Error in Set/Get" #variable << " with a literal '3'" << std::endl;             \ 
  275       return EXIT_FAILURE;                                                                         \ 
  277     object->Set##variable(originalChar);                                                           \ 
  281 #define EXERCISE_BASIC_INTERACTOR_OBSERVER_METHODS(object)                                         \ 
  283     EXERCISE_BASIC_OBJECT_METHODS(object);                                                         \ 
  284     vtkSmartPointer<vtkRenderer> ren1 = vtkSmartPointer<vtkRenderer>::New();                       \ 
  285     vtkSmartPointer<vtkCamera> cam1 = vtkSmartPointer<vtkCamera>::New();                           \ 
  286     ren1->SetActiveCamera(cam1);                                                                   \ 
  287     vtkSmartPointer<vtkRenderWindow> renWin = vtkSmartPointer<vtkRenderWindow>::New();             \ 
  288     renWin->SetMultiSamples(0);                                                                    \ 
  289     renWin->AddRenderer(ren1);                                                                     \ 
  290     if (object->GetInteractor() != nullptr)                                                        \ 
  292       std::cout << "Object has an interactor already defined." << std::endl;                       \ 
  294     vtkSmartPointer<vtkRenderWindowInteractor> iren =                                              \ 
  295       vtkSmartPointer<vtkRenderWindowInteractor>::New();                                           \ 
  296     iren->SetRenderWindow(renWin);                                                                 \ 
  297     object->SetInteractor(iren);                                                                   \ 
  298     if (object->GetInteractor() != iren)                                                           \ 
  300       std::cerr << "Error in Set/GetInteractor" << std::endl;                                      \ 
  301       return EXIT_FAILURE;                                                                         \ 
  303     if (object->GetDefaultRenderer() != nullptr)                                                   \ 
  305       std::cout << "Object has default renderer already defined." << std::endl;                    \ 
  308     vtkSmartPointer<vtkRenderer> ren = vtkSmartPointer<vtkRenderer>::New();                        \ 
  309     renWin->AddRenderer(ren);                                                                      \ 
  310     object->SetDefaultRenderer(ren);                                                               \ 
  311     if (object->GetDefaultRenderer() != ren)                                                       \ 
  313       std::cerr << "Error in Set/GetDefaultRenderer, default renderer is "                         \ 
  314                 << (object->GetDefaultRenderer() == nullptr ? "nullptr" : "not null")              \ 
  316       return EXIT_FAILURE;                                                                         \ 
  318     object->SetCurrentRenderer(ren);                                                               \ 
  319     if (object->GetCurrentRenderer() != ren)                                                       \ 
  321       std::cerr << "Get current renderer failed." << std::endl;                                    \ 
  324     iren->Initialize();                                                                            \ 
  328       object->CreateDefaultRepresentation();                                                       \ 
  329       TEST_SET_GET_BOOLEAN(object, Enabled);                                                       \ 
  331       if (!object->GetEnabled())                                                                   \ 
  333         std::cerr << "Error in On" << std::endl;                                                   \ 
  334         return EXIT_FAILURE;                                                                       \ 
  337       if (object->GetEnabled())                                                                    \ 
  339         std::cerr << "Error in Off" << std::endl;                                                  \ 
  340         return EXIT_FAILURE;                                                                       \ 
  343     TEST_SET_GET_DOUBLE(object, Priority, 0.0);                                                    \ 
  344     float min = object->GetPriorityMinValue();                                                     \ 
  345     float max = object->GetPriorityMaxValue();                                                     \ 
  346     std::cout << "Priority min = " << min << ", max = " << max << std::endl;                       \ 
  347     TEST_SET_GET_DOUBLE(object, Priority, 0.1f);                                                   \ 
  348     TEST_SET_GET_DOUBLE(object, Priority, 0.5f);                                                   \ 
  349     TEST_SET_GET_DOUBLE(object, Priority, 0.9f);                                                   \ 
  350     TEST_SET_GET_DOUBLE(object, Priority, 1.0f);                                                   \ 
  352     TEST_SET_GET_BOOLEAN(object, KeyPressActivation);                                              \ 
  353     TEST_SET_GET_CHAR(object, KeyPressActivationValue);                                            \ 
  359       double x = 1.0, y = 1.0, z = 1.0;                                                            \ 
  360       object->ComputeDisplayToWorld(ren, x, y, z, worldPt);                                        \ 
  361       std::cout << "Display " << x << "," << y << "," << z << " to world = " << worldPt[0] << ","  \ 
  362                 << worldPt[1] << "," << worldPt[2] << "," << worldPt[3] << std::endl;              \ 
  363       double displayPt[3];                                                                         \ 
  364       object->ComputeWorldToDisplay(ren, x, y, z, displayPt);                                      \ 
  365       std::cout << "World " << x << "," << y << "," << z << " to display = " << displayPt[0]       \ 
  366                 << "," << displayPt[1] << "," << displayPt[2] << std::endl;                        \ 
  369     object->GrabFocus(nullptr, nullptr);                                                           \ 
  370     object->ReleaseFocus();                                                                        \ 
  374 #define EXERCISE_BASIC_ABSTRACT_METHODS(object)                                                    \ 
  376     EXERCISE_BASIC_INTERACTOR_OBSERVER_METHODS(object);                                            \ 
  377     TEST_SET_GET_BOOLEAN(object, ProcessEvents);                                                   \ 
  378     if (object->GetEventTranslator() == nullptr)                                                   \ 
  380       std::cerr << "Error getting event translator, is null." << std::endl;                        \ 
  381       return EXIT_FAILURE;                                                                         \ 
  383     object->CreateDefaultRepresentation();                                                         \ 
  385     if (object->GetParent() != nullptr)                                                            \ 
  387       std::cerr << "Error, parent is not null." << std::endl;                                      \ 
  388       return EXIT_FAILURE;                                                                         \ 
  393 #define EXERCISE_BASIC_BORDER_METHODS(object)                                                      \ 
  395     EXERCISE_BASIC_ABSTRACT_METHODS(object);                                                       \ 
  396     TEST_SET_GET_BOOLEAN(object, Selectable);                                                      \ 
  397     TEST_SET_GET_BOOLEAN(object, Resizable);                                                       \ 
  401 #define EXERCISE_BASIC_HOVER_METHODS(object)                                                       \ 
  403     EXERCISE_BASIC_ABSTRACT_METHODS(object);                                                       \ 
  404     TEST_SET_GET_INT(object, TimerDuration, 1);                                                    \ 
  405     TEST_SET_GET_INT(object, TimerDuration, 2);                                                    \ 
  406     TEST_SET_GET_INT(object, TimerDuration, 50000);                                                \ 
  407     TEST_SET_GET_INT(object, TimerDuration, 99999);                                                \ 
  408     TEST_SET_GET_INT(object, TimerDuration, 100000);                                               \ 
  412 #define EXERCISE_BASIC_PROP_METHODS(className, object)                                             \ 
  414     EXERCISE_BASIC_OBJECT_METHODS(object);                                                         \ 
  415     vtkSmartPointer<vtkPropCollection> propCollection = vtkSmartPointer<vtkPropCollection>::New(); \ 
  416     object->GetActors(propCollection);                                                             \ 
  417     object->GetActors2D(propCollection);                                                           \ 
  418     object->GetVolumes(propCollection);                                                            \ 
  420     TEST_SET_GET_BOOLEAN(object, Visibility);                                                      \ 
  421     TEST_SET_GET_BOOLEAN(object, Pickable);                                                        \ 
  422     TEST_SET_GET_BOOLEAN(object, Dragable);                                                        \ 
  423     TEST_SET_GET_BOOLEAN(object, UseBounds);                                                       \ 
  424     object->UseBoundsOff();                                                                        \ 
  428     vtkMTimeType redrawMTime = object->GetRedrawMTime();                                           \ 
  429     std::cout << "Redraw Modified Time = " << redrawMTime << std::endl;                            \ 
  431     vtkSmartPointer<className> copyProp = vtkSmartPointer<className>::New();                       \ 
  432     object->ShallowCopy(copyProp);                                                                 \ 
  434     object->InitPathTraversal();                                                                   \ 
  436     vtkSmartPointer<vtkAssemblyPath> assemblyPath = vtkSmartPointer<vtkAssemblyPath>::New();       \ 
  437     assemblyPath = object->GetNextPath();                                                          \ 
  438     std::cout << "Number of paths = " << object->GetNumberOfPaths() << std::endl;                  \ 
  440     vtkSmartPointer<vtkMatrix4x4> mat = vtkSmartPointer<vtkMatrix4x4>::New();                      \ 
  441     object->PokeMatrix(mat);                                                                       \ 
  442     mat = object->GetMatrix();                                                                     \ 
  443     if (mat == nullptr)                                                                            \ 
  445       std::cout << "No matrix." << std::endl;                                                      \ 
  448     vtkSmartPointer<vtkInformation> info = vtkSmartPointer<vtkInformation>::New();                 \ 
  449     info = object->GetPropertyKeys();                                                              \ 
  450     if (info != nullptr)                                                                           \ 
  452       info->Print(std::cout);                                                                      \ 
  456       std::cout << "No property keys" << std::endl;                                                \ 
  458     object->SetPropertyKeys(info);                                                                 \ 
  459     std::cout << "Has null required keys? " << object->HasKeys(nullptr) << std::endl;              \ 
  461     std::cout << "Skipping the internal render calls, requires vtkViewPort. Testing get macros."   \ 
  463     std::cout << "HasTranslucentPolygonalGeometry = " << object->HasTranslucentPolygonalGeometry() \ 
  465     std::cout << "AllocatedRenderTime = " << object->GetAllocatedRenderTime() << std::endl;        \ 
  466     std::cout << "RenderTimeMultiplier = " << object->GetRenderTimeMultiplier() << std::endl;      \ 
  467     std::cout << "SupportsSelection = " << object->GetSupportsSelection() << std::endl;            \ 
  468     std::cout << "NumberOfConsumers = " << object->GetNumberOfConsumers() << std::endl;            \ 
  471 #define NOT_DEFINED_CONSUMERS_FAIL()                                                               \ 
  473     vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();                            \ 
  474     object->AddConsumer(actor);                                                                    \ 
  475     if (object->IsConsumer(actor) != 1)                                                            \ 
  477       std::cerr << "Failed IsConsumer check for a valid consumer." << std::endl;                   \ 
  478       return EXIT_FAILURE;                                                                         \ 
  480     if (object->IsConsumer(nullptr) != 0)                                                          \ 
  482       std::cerr << "Failed IsConsumer check for a null consumer." << std::endl;                    \ 
  483       return EXIT_FAILURE;                                                                         \ 
  485     vtkSmartPointer<vtkActor> actor2 = object->GetConsumer(0);                                     \ 
  486     if (actor2 != actor)                                                                           \ 
  488       std::cerr << "Failed get consumer check for a valid consumer." << std::endl;                 \ 
  489       return EXIT_FAILURE;                                                                         \ 
  491     object->RemoveConsumer(actor);                                                                 \ 
  492     actor2 = object->GetConsumer(0);                                                               \ 
  493     if (actor2 != nullptr)                                                                         \ 
  495       std::cerr << "Failed get consumer check for an invalid consumer number 0." << std::endl;     \ 
  496       return EXIT_FAILURE;                                                                         \ 
  501 #define EXERCISE_BASIC_REPRESENTATION_METHODS(className, object)                                   \ 
  502   std::cout << "Creating a renderer and a default widget..." << std::endl;                         \ 
  503   vtkSmartPointer<vtkCamera> cam1 = vtkSmartPointer<vtkCamera>::New();                             \ 
  504   vtkSmartPointer<vtkRenderer> ren1 = vtkSmartPointer<vtkRenderer>::New();                         \ 
  505   ren1->SetActiveCamera(cam1);                                                                     \ 
  506   vtkSmartPointer<vtkRenderWindow> renWin = vtkSmartPointer<vtkRenderWindow>::New();               \ 
  507   renWin->SetMultiSamples(0);                                                                      \ 
  508   renWin->AddRenderer(ren1);                                                                       \ 
  509   vtkSmartPointer<vtkRenderWindowInteractor> iren =                                                \ 
  510     vtkSmartPointer<vtkRenderWindowInteractor>::New();                                             \ 
  511   iren->SetRenderWindow(renWin);                                                                   \ 
  513   object->SetRenderer(ren1);                                                                       \ 
  514   vtkSmartPointer<vtkRenderer> ren2 = object->GetRenderer();                                       \ 
  517     std::cerr << "Failure in GetRenderer." << std::endl;                                           \ 
  518     return EXIT_FAILURE;                                                                           \ 
  521   object->BuildRepresentation();                                                                   \ 
  523   double bounds[6] = { -1.0, 0.0, -10.0, 10.0, -5.0, 2.0 };                                        \ 
  524   object->PlaceWidget(bounds);                                                                     \ 
  525   const double* bounds2 = object->GetBounds();                                                     \ 
  526   if (bounds2 == nullptr)                                                                          \ 
  528     std::cout << "GetBounds is null." << std::endl;                                                \ 
  532     std::cout << "Bounds = " << bounds[0] << "," << bounds[1] << "," << bounds[2] << ","           \ 
  533               << bounds[3] << "," << bounds[4] << "," << bounds[5] << std::endl;                   \ 
  536   double eventPos[2] = { 10.0, 10.0 };                                                             \ 
  537   object->StartWidgetInteraction(eventPos);                                                        \ 
  538   object->WidgetInteraction(eventPos);                                                             \ 
  539   object->EndWidgetInteraction(eventPos);                                                          \ 
  540   std::cout << "InteractionState computed to be = " << object->ComputeInteractionState(10, 10, 0)  \ 
  542   std::cout << "GetInteractionState = " << object->GetInteractionState() << std::endl;             \ 
  543   object->Highlight(0);                                                                            \ 
  544   object->Highlight(1);                                                                            \ 
  546   TEST_SET_GET_DOUBLE_RANGE(object, PlaceFactor, 1.01, 1000.0);                                    \ 
  547   TEST_SET_GET_DOUBLE_RANGE(object, HandleSize, 1.002, 999.0);                                     \ 
  548   TEST_SET_GET_BOOLEAN(object, NeedToRender);                                                      \ 
  550   std::cout << "Trying to get back to init state for further testing." << std::endl;               \ 
  551   object->SetPlaceFactor(0.5);                                                                     \ 
  552   object->SetHandleSize(0.05);                                                                     \ 
  553   std::cout << "Done basic rep methods" << std::endl;                                              \ 
  554   EXERCISE_BASIC_PROP_METHODS(className, object); 
  557 #define EXERCISE_BASIC_ANGLE_REPRESENTATION_METHODS(className, object)                             \ 
  559     vtkSmartPointer<vtkPointHandleRepresentation2D> phandle0 =                                     \ 
  560       vtkSmartPointer<vtkPointHandleRepresentation2D>::New();                                      \ 
  561     object->SetHandleRepresentation(phandle0);                                                     \ 
  562     object->InstantiateHandleRepresentation();                                                     \ 
  564     std::cout << "GetAngle = " << object->GetAngle() << std::endl;                                 \ 
  567     object->GetPoint1WorldPosition(pos);                                                           \ 
  568     std::cout << "GetPoint1WorldPosition = " << pos[0] << ", " << pos[1] << ", " << pos[2]         \ 
  570     object->GetCenterWorldPosition(pos);                                                           \ 
  571     std::cout << "GetCenterWorldPosition = " << pos[0] << ", " << pos[1] << ", " << pos[2]         \ 
  573     object->GetPoint2WorldPosition(pos);                                                           \ 
  574     std::cout << "GetPoint2WorldPosition = " << pos[0] << ", " << pos[1] << ", " << pos[2]         \ 
  581     object->SetCenterDisplayPosition(pos2);                                                        \ 
  582     object->GetCenterDisplayPosition(pos);                                                         \ 
  583     if (pos[0] != pos2[0] || pos[0] != pos2[0] || pos[0] != pos2[0])                               \ 
  585       std::cerr << "Failed to SetCenterDisplayPosition to " << pos2[0] << ", " << pos2[1] << ", "  \ 
  586                 << pos2[2] << ", instead got " << pos[0] << ", " << pos[1] << ", " << pos[2]       \ 
  588       return EXIT_FAILURE;                                                                         \ 
  592     object->SetPoint1DisplayPosition(pos2);                                                        \ 
  593     object->GetPoint1DisplayPosition(pos);                                                         \ 
  594     if (pos[0] != pos2[0] || pos[0] != pos2[0] || pos[0] != pos2[0])                               \ 
  596       std::cerr << "Failed to SetPoint1DisplayPosition to " << pos2[0] << ", " << pos2[1] << ", "  \ 
  597                 << pos2[2] << ", instead got " << pos[0] << ", " << pos[1] << ", " << pos[2]       \ 
  599       return EXIT_FAILURE;                                                                         \ 
  603     object->SetPoint2DisplayPosition(pos2);                                                        \ 
  604     object->GetPoint2DisplayPosition(pos);                                                         \ 
  605     if (pos[0] != pos2[0] || pos[0] != pos2[0] || pos[0] != pos2[0])                               \ 
  607       std::cerr << "Failed to SetPoint2DisplayPosition to " << pos2[0] << ", " << pos2[1] << ", "  \ 
  608                 << pos2[2] << ", instead got " << pos[0] << ", " << pos[1] << ", " << pos[2]       \ 
  610       return EXIT_FAILURE;                                                                         \ 
  613     vtkSmartPointer<vtkPointHandleRepresentation2D> phandle =                                      \ 
  614       vtkSmartPointer<vtkPointHandleRepresentation2D>::New();                                      \ 
  615     object->SetHandleRepresentation(phandle);                                                      \ 
  616     object->InstantiateHandleRepresentation();                                                     \ 
  618     vtkSmartPointer<vtkHandleRepresentation> handleRep = nullptr;                                  \ 
  619     handleRep = object->GetPoint1Representation();                                                 \ 
  620     handleRep = object->GetPoint2Representation();                                                 \ 
  621     handleRep = object->GetCenterRepresentation();                                                 \ 
  623     TEST_SET_GET_INT_RANGE(object, Tolerance, 2, 99);                                              \ 
  624     TEST_SET_GET_STRING(object, LabelFormat);                                                      \ 
  625     TEST_SET_GET_BOOLEAN(object, Ray1Visibility);                                                  \ 
  626     TEST_SET_GET_BOOLEAN(object, Ray2Visibility);                                                  \ 
  627     TEST_SET_GET_BOOLEAN(object, ArcVisibility);                                                   \ 
  629     double e[2] = { 5.0, 1.0 };                                                                    \ 
  630     object->CenterWidgetInteraction(e);                                                            \ 
  631     EXERCISE_BASIC_REPRESENTATION_METHODS(className, object);                                      \ 
  635 #define EXERCISE_BASIC_BORDER_REPRESENTATION_METHODS(className, object)                            \ 
  637     EXERCISE_BASIC_REPRESENTATION_METHODS(className, object);                                      \ 
  639     double pos[2] = { 10.0, 11.0 };                                                                \ 
  640     double* pos2 = nullptr;                                                                        \ 
  641     object->SetPosition(pos);                                                                      \ 
  642     pos2 = object->GetPosition();                                                                  \ 
  643     if (pos2 == nullptr)                                                                           \ 
  645       std::cerr << "Failure in Get/Set Position pos, got null position back." << std::endl;        \ 
  646       return EXIT_FAILURE;                                                                         \ 
  648     else if (pos2[0] != pos[0] || pos2[1] != pos[1])                                               \ 
  650       std::cerr << "Failure in Get/Set Position pos, expected " << pos[0] << ", " << pos[1]        \ 
  651                 << ", instead got " << pos2[0] << ", " << pos2[1] << std::endl;                    \ 
  652       return EXIT_FAILURE;                                                                         \ 
  656       std::cout << "Set Position to " << pos2[0] << ", " << pos2[1] << std::endl;                  \ 
  660     object->SetPosition(pos[0], pos[1]);                                                           \ 
  661     pos2 = object->GetPosition();                                                                  \ 
  662     if (pos2 == nullptr || pos2[0] != pos[0] || pos2[1] != pos[1])                                 \ 
  664       std::cerr << "Failure in Get/Set Position x,y, expected " << pos[0] << ", " << pos[1]        \ 
  665                 << ", instead got " << pos2[0] << ", " << pos2[1] << std::endl;                    \ 
  666       return EXIT_FAILURE;                                                                         \ 
  668     vtkSmartPointer<vtkCoordinate> coord = object->GetPositionCoordinate();                        \ 
  669     pos2 = coord->GetValue();                                                                      \ 
  670     if (pos2 == nullptr || pos2[0] != pos[0] || pos2[1] != pos[1])                                 \ 
  672       std::cerr << "Failure in Get/ Coordinate, expected " << pos[0] << ", " << pos[1]             \ 
  673                 << ", instead got " << pos2[0] << ", " << pos2[1] << std::endl;                    \ 
  674       return EXIT_FAILURE;                                                                         \ 
  678     object->SetPosition2(pos);                                                                     \ 
  679     pos2 = object->GetPosition2();                                                                 \ 
  680     if (pos2 == nullptr || pos2[0] != pos[0] || pos2[1] != pos[1])                                 \ 
  682       std::cerr << "Failure in Get/Set Position2 pos, expected " << pos[0] << ", " << pos[1]       \ 
  683                 << ", instead got " << pos2[0] << ", " << pos2[1] << std::endl;                    \ 
  684       return EXIT_FAILURE;                                                                         \ 
  687     object->SetPosition2(pos[0], pos[1]);                                                          \ 
  688     pos2 = object->GetPosition2();                                                                 \ 
  689     if (pos2 == nullptr || pos2[0] != pos[0] || pos2[1] != pos[1])                                 \ 
  691       std::cerr << "Failure in Get/Set Position2 x,y, expected " << pos[0] << ", " << pos[1]       \ 
  692                 << ", instead got " << pos2[0] << ", " << pos2[1] << std::endl;                    \ 
  693       return EXIT_FAILURE;                                                                         \ 
  695     coord = object->GetPosition2Coordinate();                                                      \ 
  696     pos2 = coord->GetValue();                                                                      \ 
  697     if (pos2 == nullptr || pos2[0] != pos[0] || pos2[1] != pos[1])                                 \ 
  699       std::cerr << "Failure in Get/ Coordinate 2, expected " << pos[0] << ", " << pos[1]           \ 
  700                 << ", instead got " << pos2[0] << ", " << pos2[1] << std::endl;                    \ 
  701       return EXIT_FAILURE;                                                                         \ 
  704     TEST_SET_GET_INT(object, ShowBorder, 0);                                                       \ 
  705     TEST_SET_GET_INT(object, ShowBorder, 1);                                                       \ 
  706     TEST_SET_GET_INT(object, ShowBorder, 2);                                                       \ 
  707     object->SetShowBorderToOff();                                                                  \ 
  708     object->SetShowBorderToOn();                                                                   \ 
  709     object->SetShowBorderToActive();                                                               \ 
  711     vtkSmartPointer<vtkProperty2D> borderProperty = object->GetBorderProperty();                   \ 
  713     TEST_SET_GET_BOOLEAN(object, ProportionalResize);                                              \ 
  715     TEST_SET_GET_VECTOR2_INT_RANGE(object, MinimumSize, 0, 100);                                   \ 
  716     TEST_SET_GET_VECTOR2_INT_RANGE(object, MaximumSize, 0, 100);                                   \ 
  717     TEST_SET_GET_INT_RANGE(object, Tolerance, 2, 9);                                               \ 
  719     double* selPoint = object->GetSelectionPoint();                                                \ 
  722       std::cout << "Selection Point = " << selPoint[0] << ", " << selPoint[1] << std::endl;        \ 
  725     TEST_SET_GET_BOOLEAN(object, Moving);                                                          \ 
  728     object->GetSize(size);                                                                         \ 
  729     std::cout << "Size = " << size[0] << ", " << size[1] << std::endl;                             \ 
  731     int interactionState = object->ComputeInteractionState(10, 10);                                \ 
  732     std::cout << "Interaction state = " << interactionState << std::endl;                          \ 
  736 #define EXERCISE_BASIC_IMPLICIT_PLANE_REPRESENTATION_METHODS(className, object)                    \ 
  738     EXERCISE_BASIC_REPRESENTATION_METHODS(className, object);                                      \ 
  740     TEST_SET_GET_VECTOR3_DOUBLE_RANGE(node1, Origin, -100, 100);                                   \ 
  741     TEST_SET_GET_VECTOR3_DOUBLE_RANGE(node1, Normal, -1, 1);                                       \ 
  742     TEST_SET_GET_BOOLEAN(node1, NormalToXAxis);                                                    \ 
  743     TEST_SET_GET_BOOLEAN(node1, NormalToYAxis);                                                    \ 
  744     TEST_SET_GET_BOOLEAN(node1, NormalToZAxis);                                                    \ 
  745     TEST_SET_GET_BOOLEAN(node1, Tubing);                                                           \ 
  746     TEST_SET_GET_BOOLEAN(node1, DrawPlane);                                                        \ 
  747     TEST_SET_GET_BOOLEAN(node1, OutlineTranslation);                                               \ 
  748     TEST_SET_GET_BOOLEAN(node1, OutsideBounds);                                                    \ 
  749     TEST_SET_GET_BOOLEAN(node1, ScaleEnabled);                                                     \ 
  753 #define TEST_SET_GET_PROPERTY(object, variable)                                                    \ 
  755     vtkSmartPointer<vtkProperty> prop1 = vtkSmartPointer<vtkProperty>::New();                      \ 
  756     double colour[3] = { 0.2, 0.3, 0.4 };                                                          \ 
  757     prop1->SetColor(colour);                                                                       \ 
  758     node1->Set##variable(prop1);                                                                   \ 
  759     vtkSmartPointer<vtkProperty> prop = node1->Get##variable();                                    \ 
  762       std::cerr << "Got null variable property back after setting it!" << std::endl;               \ 
  763       return EXIT_FAILURE;                                                                         \ 
  765     double* col = prop->GetColor();                                                                \ 
  768       std::cerr << "Got null colour back!" << std::endl;                                           \ 
  769       return EXIT_FAILURE;                                                                         \ 
  771     if (col[0] != colour[0] || col[1] != colour[1] || col[2] != colour[2])                         \ 
  773       std::cerr << "Got wrong colour back after setting it! Expected " << colour[0] << ", "        \ 
  774                 << colour[1] << ", " << colour[2] << ", but got " << col[0] << ", " << col[1]      \ 
  775                 << ", " << col[2] << std::endl;                                                    \ 
  776       return EXIT_FAILURE;                                                                         \ 
  783 #define EXERCISE_BASIC_HANDLE_REPRESENTATION_METHODS(className, object)                            \ 
  785     EXERCISE_BASIC_REPRESENTATION_METHODS(className, object);                                      \ 
  787     double dpos[3], wpos[3];                                                                       \ 
  797     std::cout << "Testing SetWorldPosition" << std::endl;                                          \ 
  799     object->SetWorldPosition(wpos);                                                                \ 
  800     std::cout << "Testing GetWorldPosition" << std::endl;                                          \ 
  801     object->GetWorldPosition(pos2);                                                                \ 
  802     if (pos2[0] != wpos[0] || pos2[1] != wpos[1] || pos2[2] != wpos[2])                            \ 
  804       std::cerr << "Failure in Get WorldPosition pos2, expected " << wpos[0] << ", " << wpos[1]    \ 
  805                 << ", " << wpos[2] << ", instead got " << pos2[0] << ", " << pos2[1] << ", "       \ 
  806                 << pos2[2] << std::endl;                                                           \ 
  807       return EXIT_FAILURE;                                                                         \ 
  809     pos3 = object->GetWorldPosition();                                                             \ 
  812       std::cerr << "Failure in double * GetWorldPosition , expected " << wpos[0] << ", "           \ 
  813                 << wpos[1] << ", " << wpos[2] << ", instead got a null pointer." << std::endl;     \ 
  814       return EXIT_FAILURE;                                                                         \ 
  816     if (pos3[0] != wpos[0] || pos3[1] != wpos[1] || pos3[2] != wpos[2])                            \ 
  818       std::cerr << "Failure in double * GetWorldyPosition , expected " << wpos[0] << ", "          \ 
  819                 << wpos[1] << ", " << wpos[2] << ", instead got " << pos3[0] << ", " << pos3[1]    \ 
  820                 << ", " << pos3[2] << std::endl;                                                   \ 
  821       return EXIT_FAILURE;                                                                         \ 
  823     std::cout << "Done testing world position." << std::endl;                                      \ 
  825     std::cout << "Testing Set/Get Display Position" << std::endl;                                  \ 
  827     object->GetDisplayPosition(pos2);                                                              \ 
  828     std::cout << "After GetDisplayPosition." << std::endl;                                         \ 
  829     object->SetDisplayPosition(dpos);                                                              \ 
  830     std::cout << "After SetDisplayPosition" << std::endl;                                          \ 
  831     object->GetDisplayPosition(pos2);                                                              \ 
  832     std::cout << "After GetDisplayPosition second time." << std::endl;                             \ 
  833     if (pos2[0] != 0 || pos2[1] != 0)                                                              \ 
  835       std::cerr << "Failure in GetDisplayPosition pos2, expected (0,0) instead got " << pos2[0]    \ 
  836                 << ", " << pos2[1] << std::endl;                                                   \ 
  837       return EXIT_FAILURE;                                                                         \ 
  839     pos3 = object->GetDisplayPosition();                                                           \ 
  843         << "Failure in double * GetDisplayPosition, expected (0,0) instead got a null pointer."    \ 
  845       return EXIT_FAILURE;                                                                         \ 
  847     if (pos3[0] != 0 || pos3[1] != 0)                                                              \ 
  849       std::cerr << "Failure in double * GetDisplayPosition , expected (0,0) instead got "          \ 
  850                 << pos3[0] << ", " << pos3[1] << std::endl;                                        \ 
  851       return EXIT_FAILURE;                                                                         \ 
  853     TEST_SET_GET_INT_RANGE(object, Tolerance, 2, 99);                                              \ 
  854     TEST_SET_GET_BOOLEAN(object, ActiveRepresentation);                                            \ 
  855     TEST_SET_GET_BOOLEAN(object, Constrained);                                                     \ 
  857     vtkSmartPointer<vtkRenderer> ren3 = object->GetRenderer();                                     \ 
  858     double posToCheck[3] = { 0.0, 0.0, 0.0 };                                                      \ 
  859     int flag = object->CheckConstraint(ren3, posToCheck);                                          \ 
  860     std::cout << "Check Constraint = " << flag << std::endl;                                       \ 
  862     std::cout << "MTime = " << object->GetMTime() << std::endl;                                    \ 
  864     vtkSmartPointer<vtkPointPlacer> pplacer = vtkSmartPointer<vtkPointPlacer>::New();              \ 
  865     object->SetPointPlacer(pplacer);                                                               \ 
  866     vtkSmartPointer<vtkPointPlacer> pplacer2 = object->GetPointPlacer();                           \ 
  867     if (pplacer2 != pplacer)                                                                       \ 
  869       std::cerr << "Error in Set/Get point placer." << std::endl;                                  \ 
  870       return EXIT_FAILURE;                                                                         \ 
  872     flag = object->CheckConstraint(ren3, posToCheck);                                              \ 
  873     std::cout << "Check Constraint after setting point placer = " << flag << std::endl;            \ 
  877 #define EXERCISE_BASIC_ABSTRACT_POLYGONAL_HANDLE_REPRESENTATION3D_METHODS(className, object)       \ 
  879     EXERCISE_BASIC_HANDLE_REPRESENTATION_METHODS(className, object);                               \ 
  881     vtkSmartPointer<vtkPolyData> pd = vtkSmartPointer<vtkPolyData>::New();                         \ 
  882     object->SetHandle(pd);                                                                         \ 
  883     vtkSmartPointer<vtkPolyData> pd2 = object->GetHandle();                                        \ 
  884     if (pd2 == nullptr)                                                                            \ 
  886       std::cerr << "Error getting handle, null pointer." << std::endl;                             \ 
  887       return EXIT_FAILURE;                                                                         \ 
  891       std::cerr << "Error getting handle, not the same as set." << std::endl;                      \ 
  892       return EXIT_FAILURE;                                                                         \ 
  894     TEST_SET_GET_PROPERTY(object, Property);                                                       \ 
  895     TEST_SET_GET_PROPERTY(object, SelectedProperty);                                               \ 
  897     vtkSmartPointer<vtkAbstractTransform> at = object->GetTransform();                             \ 
  899     TEST_SET_GET_BOOLEAN(object, LabelVisibility);                                                 \ 
  900     TEST_SET_GET_STRING(object, LabelText);                                                        \ 
  901     TEST_SET_GET_VECTOR3_DOUBLE_RANGE(object, LabelTextScale, 0.0, 10.0);                          \ 
  903     vtkSmartPointer<vtkFollower> follower = object->GetLabelTextActor();                           \ 
  904     if (follower == nullptr)                                                                       \ 
  906       std::cout << "Follower is null." << std::endl;                                               \ 
  909     object->SetUniformScale(-1.0);                                                                 \ 
  910     object->SetUniformScale(0.0);                                                                  \ 
  911     object->SetUniformScale(1.0);                                                                  \ 
  912     object->SetUniformScale(35.44);                                                                \ 
  914     TEST_SET_GET_BOOLEAN(object, HandleVisibility);                                                \