MITK-IGT
IGT Extension of MITK
Loading...
Searching...
No Matches
mitkTrackingDeviceSourceTest.cpp
Go to the documentation of this file.
1/*============================================================================
2
3The Medical Imaging Interaction Toolkit (MITK)
4
5Copyright (c) German Cancer Research Center (DKFZ)
6All rights reserved.
7
8Use of this source code is governed by a 3-clause BSD license that can be
9found in the LICENSE file.
10
11============================================================================*/
12
15
16#include "mitkTestingMacros.h"
17#include <mitkReferenceCountWatcher.h>
18#include "itksys/SystemTools.hxx"
19
23int 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");
48 tracker = mitk::VirtualTrackingDevice::New();
49 mitk::ReferenceCountWatcher::Pointer watch = new mitk::ReferenceCountWatcher(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
111 tracker = mitk::VirtualTrackingDevice::New();
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}
mitk::Point3D PositionType
Type that holds the position part of the tracking data.
int mitkTrackingDeviceSourceTest(int, char *[])
MITKIGTBASE_EXPORT bool Equal(const mitk::NavigationData &leftHandSide, const mitk::NavigationData &rightHandSide, ScalarType eps=mitk::eps, bool verbose=false)
Equal A function comparing two navigation data objects for beeing equal in meta- and imagedata.