Medical Imaging Interaction Toolkit  2018.4.99-389bf124
Medical Imaging Interaction Toolkit
mitkIGTLDeviceSourceTest.cpp
Go to the documentation of this file.
1 /*============================================================================
2 
3 The Medical Imaging Interaction Toolkit (MITK)
4 
5 Copyright (c) German Cancer Research Center (DKFZ)
6 All rights reserved.
7 
8 Use of this source code is governed by a 3-clause BSD license that can be
9 found in the LICENSE file.
10 
11 ============================================================================*/
12 
15 
16 #include "mitkTestingMacros.h"
18 #include "itksys/SystemTools.hxx"
19 
23 int mitkTrackingDeviceSourceTest(int /* argc */, char* /*argv*/[])
24 {
25  MITK_TEST_BEGIN("TrackingDeviceSource");
26 
27  // let's create an object of our class
28  mitk::TrackingDeviceSource::Pointer mySource = mitk::TrackingDeviceSource::New();
29 
30  // first test: did this work?
31  // using MITK_TEST_CONDITION_REQUIRED makes the test stop after failure, since
32  // it makes no sense to continue without an object.
33  MITK_TEST_CONDITION_REQUIRED(mySource.IsNotNull(), "Testing instantiation");
34 
35  mySource->SetTrackingDevice(nullptr);
36  MITK_TEST_CONDITION(mySource->GetTrackingDevice() == nullptr, "Testing Set/GetTrackingDevice(nullptr)");
37  MITK_TEST_CONDITION(mySource->GetNumberOfOutputs() == 0, "Testing GetNumberOfOutputs with nullptr td");
38  MITK_TEST_FOR_EXCEPTION(std::invalid_argument, mySource->Connect());
39  MITK_TEST_FOR_EXCEPTION(std::invalid_argument, mySource->StartTracking());
40 
41  mitk::VirtualTrackingDevice::Pointer tracker = mitk::VirtualTrackingDevice::New();
42  tracker->SetRefreshRate(10);
43 
44 
45  mySource->SetTrackingDevice(tracker);
46  MITK_TEST_CONDITION(mySource->GetTrackingDevice() == tracker.GetPointer(), "Testing Set/GetTrackingDevice(tracker)");
47  MITK_TEST_CONDITION(mySource->GetNumberOfOutputs() == 0, "Testing GetNumberOfOutputs with no tool tracker");
50 
51  tracker->AddTool("T0");
52  tracker->AddTool("T1");
53  mySource->SetTrackingDevice(tracker);
54  MITK_TEST_CONDITION(mySource->GetTrackingDevice() == tracker.GetPointer(), "Testing Set/GetTrackingDevice(tracker2)");
55  MITK_TEST_CONDITION(mySource->GetNumberOfOutputs() == 2, "Testing GetNumberOfOutputs with 2 tools tracker");
56  MITK_TEST_CONDITION(mySource->IsConnected() == false, "Testing IsConnected()");
57  mySource->Connect();
58  MITK_TEST_CONDITION(mySource->IsConnected() == true, "Testing Connect()/IsConnected()");
59  MITK_TEST_CONDITION(tracker->GetState() == mitk::TrackingDevice::Ready, "Testing Connect()/IsConnected() 2");
60  mySource->Disconnect();
61  MITK_TEST_CONDITION(mySource->IsConnected() == false, "Testing Disconnect()/IsConnected()");
62  MITK_TEST_CONDITION(tracker->GetState() == mitk::TrackingDevice::Setup, "Testing Disconnect()/IsConnected() 2");
63 
64  mySource->Connect();
65  mySource->StartTracking();
66  MITK_TEST_CONDITION(mySource->IsConnected() == true, "Testing StartTracking()/IsConnected()");
67  MITK_TEST_CONDITION(mySource->IsTracking() == true, "Testing StartTracking()/IsTracking()");
68  MITK_TEST_CONDITION(tracker->GetState() == mitk::TrackingDevice::Tracking, "Testing StartTracking()/IsTracking() 2");
69 
70  unsigned long modTime = mySource->GetMTime();
71  mySource->UpdateOutputInformation();
72  MITK_TEST_CONDITION(mySource->GetMTime() != modTime, "Testing if UpdateOutputInformation() modifies the object");
73 
74  //test getOutput()
75  mitk::NavigationData* nd0 = mySource->GetOutput();
76  MITK_TEST_CONDITION_REQUIRED(nd0!=nullptr,"Testing GetOutput() [1]");
77  nd0 = mySource->GetOutput(nd0->GetName());
78  MITK_TEST_CONDITION_REQUIRED(nd0!=nullptr,"Testing GetOutput() [2]");
79 
80  //test getOutputIndex()
81  MITK_TEST_CONDITION(mySource->GetOutputIndex(nd0->GetName())==0,"Testing GetOutputIndex()");
82 
83  //test GraftNthOutput()
84  mitk::NavigationData::Pointer ndCopy = mitk::NavigationData::New();
85  mySource->GraftNthOutput(1,nd0);
86  ndCopy = mySource->GetOutput(1);
87  MITK_TEST_CONDITION(std::string(ndCopy->GetName())==std::string(nd0->GetName()),"Testing GraftNthOutput()");
88 
89  //test GetParameters()
90  mitk::PropertyList::ConstPointer p = mySource->GetParameters();
91  MITK_TEST_CONDITION(p.IsNotNull(),"Testing GetParameters()");
92 
93  nd0->Update();
94  mitk::NavigationData::PositionType pos = nd0->GetPosition();
95  unsigned long tmpMTime0 = nd0->GetMTime();
96  itksys::SystemTools::Delay(500); // allow the tracking thread to advance the tool position
97  nd0->Update();
98  mitk::NavigationData::PositionType newPos = nd0->GetPosition();
99  if(nd0->GetMTime() == tmpMTime0) //tool not modified yet
100  {
101  MITK_TEST_CONDITION(mitk::Equal(newPos, pos) == true, "Testing if output changes on each update");
102  }
103  else
104  {
105  MITK_TEST_CONDITION(mitk::Equal(newPos, pos) == false, "Testing if output changes on each update");
106  }
107 
108  mySource->StopTracking();
109  mySource->Disconnect();
110 
112  mySource->SetTrackingDevice(tracker);
113  MITK_TEST_CONDITION(watch->GetReferenceCount() == 0, "Testing if reference to previous tracker object is released");
114  watch = nullptr;
115 
116  MITK_TEST_FOR_EXCEPTION(std::runtime_error, mySource->StartTracking()); // new tracker, needs Connect() before StartTracking()
117 
118  mySource->Connect();
119  mySource->StartTracking();
120  // itksys::SystemTools::Delay(800); // wait for tracking thread to start properly //DEBUG ONLY --> race condition. will the thread start before the object is destroyed? --> maybe hold a smartpointer?
121  try
122  {
123  mySource = nullptr; // delete source
124  tracker = nullptr; // delete tracker --> both should not result in any exceptions or deadlocks
125  }
126  catch (...)
127  {
128  MITK_TEST_FAILED_MSG(<< "exception during destruction of source or tracker!");
129  }
130 
131  // always end with this!
132  MITK_TEST_END();
133 }
int mitkTrackingDeviceSourceTest(int, char *[])
static Pointer New()
Navigation Data.
#define MITK_TEST_CONDITION_REQUIRED(COND, MSG)
section GeneralTestsDeprecatedOldTestingStyle Deprecated macros All tests with MITK_TEST_BEGIN()
#define MITK_TEST_FOR_EXCEPTION(EXCEPTIONCLASS, STATEMENT)
Simplified version of MITK_TEST_FOR_EXCEPTION_BEGIN / END for a single statement. ...
Keeps track of the reference count of an object even if it is destroyed.
#define MITK_TEST_CONDITION(COND, MSG)
#define MITK_TEST_FAILED_MSG(MSG)
Fail and finish test with message MSG.
MITKNEWMODULE_EXPORT bool Equal(mitk::ExampleDataStructure *leftHandSide, mitk::ExampleDataStructure *rightHandSide, mitk::ScalarType eps, bool verbose)
Returns true if the example data structures are considered equal.
and MITK_TEST_END()