Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include "mitkSurfaceToImageFilter.h"
00020 #include "mitkGeometryClipImageFilter.h"
00021 #include "mitkImageSliceSelector.h"
00022
00023 #include <fstream>
00024
00025 #include "mitkReferenceCountWatcher.h"
00026
00027 class TwoOutputsFilter : public mitk::SurfaceToImageFilter
00028 {
00029 public:
00030 mitkClassMacro(TwoOutputsFilter, SurfaceToImageFilter);
00031 itkNewMacro(Self);
00032 protected:
00033 TwoOutputsFilter()
00034 {
00035 mitk::Image::Pointer output
00036 = static_cast<mitk::Image*>(this->MakeOutput(0).GetPointer());
00037 Superclass::SetNumberOfRequiredOutputs(2);
00038 Superclass::SetNthOutput(1, output.GetPointer());
00039 }
00040
00041 virtual ~TwoOutputsFilter()
00042 {
00043 }
00044 };
00045
00046 template <class FilterType, class InputType>
00047 int runPipelineSmartPointerCorrectnessTestForFilterType(typename InputType::Pointer input)
00048 {
00049 typename FilterType::Pointer filter;
00050 std::cout << "Testing " << typeid(FilterType).name() << "::New(): ";
00051 filter = FilterType::New();
00052 if (filter.IsNull())
00053 {
00054 std::cout<<"[FAILED]"<<std::endl;
00055 return EXIT_FAILURE;
00056 }
00057 else
00058 {
00059 std::cout<<"[PASSED]"<<std::endl;
00060 }
00061
00062 std::cout << "Testing SetInput(" << typeid(FilterType).name() << "): ";
00063 filter->SetInput(input);
00064 std::cout<<"[PASSED]"<<std::endl;
00065
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077 std::cout << "Initializing mitk::ReferenceCountWatcher: ";
00078 mitk::ReferenceCountWatcher::Pointer filterWatcher, filterOutputWatcher;
00079 filterWatcher = new mitk::ReferenceCountWatcher(filter, "filter1");
00080 filterOutputWatcher = new mitk::ReferenceCountWatcher(filter->GetOutput(), "filter1Output");
00081 std::cout<<"[PASSED]"<<std::endl;
00082
00083 std::cout << "Testing MITK_WEAKPOINTER_PROBLEM_WORKAROUND_ENABLED part1: "<<std::endl;
00084 try
00085 {
00086 mitk::Image::Pointer output = filter->GetOutput();
00087 std::cout << "Testing to set filter to NULL, keeping reference to output:";
00088 filter = NULL;
00089 std::cout<<"[PASSED]"<<std::endl;
00090 std::cout << "Testing reference count of output: ";
00091 if(output->GetReferenceCount()!=2)
00092 {
00093 std::cout<<"[FAILED]"<<std::endl;
00094 return EXIT_FAILURE;
00095 }
00096 else
00097 std::cout<<"[PASSED]"<<std::endl;
00098 std::cout << "Testing external reference count of output: ";
00099 if(output->GetExternalReferenceCount()!=1)
00100 {
00101 std::cout<<"[FAILED]"<<std::endl;
00102 return EXIT_FAILURE;
00103 }
00104 else
00105 std::cout<<"[PASSED]"<<std::endl;
00106
00107 std::cout << "Testing to set output to NULL:";
00108
00109
00110 output = NULL;
00111 std::cout<<"[PASSED]"<<std::endl;
00112
00113 std::cout << "Testing reference count of filter:";
00114 if(filterWatcher->GetReferenceCount()!=0)
00115 {
00116 std::cout<<"[FAILED]"<<std::endl;
00117 return EXIT_FAILURE;
00118 }
00119 else
00120 std::cout<<"[PASSED]"<<std::endl;
00121
00122 std::cout << "Testing reference count of filter output:";
00123 if(filterOutputWatcher->GetReferenceCount()!=0)
00124 {
00125 std::cout<<"[FAILED]"<<std::endl;
00126 return EXIT_FAILURE;
00127 }
00128 else
00129 std::cout<<"[PASSED]"<<std::endl;
00130 }
00131 catch(...)
00132 {
00133 std::cout<<"[FAILED]"<<std::endl;
00134 return EXIT_FAILURE;
00135 }
00136
00137 std::cout << "Testing MITK_WEAKPOINTER_PROBLEM_WORKAROUND_ENABLED part2: "<<std::endl;
00138 filter = FilterType::New();
00139 filterWatcher = new mitk::ReferenceCountWatcher(filter, "filter2");
00140 filterOutputWatcher = new mitk::ReferenceCountWatcher(filter->GetOutput(), "filter2Output");
00141 try
00142 {
00143 std::cout << "Testing to set filter to NULL, keeping NO reference to output:";
00144 filter = NULL;
00145 std::cout<<"[PASSED]"<<std::endl;
00146
00147 std::cout << "Testing reference count of filter:";
00148 if(filterWatcher->GetReferenceCount()!=0)
00149 {
00150 std::cout<<"[FAILED]"<<std::endl;
00151 return EXIT_FAILURE;
00152 }
00153 else
00154 std::cout<<"[PASSED]"<<std::endl;
00155
00156 std::cout << "Testing reference count of filter output:";
00157 if(filterOutputWatcher->GetReferenceCount()!=0)
00158 {
00159 std::cout<<"[FAILED]"<<std::endl;
00160 return EXIT_FAILURE;
00161 }
00162 else
00163 std::cout<<"[PASSED]"<<std::endl;
00164 }
00165 catch(...)
00166 {
00167 std::cout<<"[FAILED]"<<std::endl;
00168 return EXIT_FAILURE;
00169 }
00170
00171 std::cout << "Testing MITK_WEAKPOINTER_PROBLEM_WORKAROUND_ENABLED part3: "<<std::endl;
00172 try
00173 {
00174 mitk::Image::Pointer output;
00175 {
00176 typename FilterType::Pointer localFilter = FilterType::New();
00177 filterWatcher = new mitk::ReferenceCountWatcher(localFilter, "filter3");
00178 filterOutputWatcher = new mitk::ReferenceCountWatcher(localFilter->GetOutput(), "filter3Output");
00179 output = localFilter->GetOutput();
00180 std::cout << "Testing running out of scope of filter, keeping reference to output:";
00181 }
00182 std::cout<<"[PASSED]"<<std::endl;
00183 std::cout << "Testing reference count of output: ";
00184 if(output->GetReferenceCount()!=2)
00185 {
00186 std::cout<<"[FAILED]"<<std::endl;
00187 return EXIT_FAILURE;
00188 }
00189 else
00190 std::cout<<"[PASSED]"<<std::endl;
00191 std::cout << "Testing external reference count of output: ";
00192 if(output->GetExternalReferenceCount()!=1)
00193 {
00194 std::cout<<"[FAILED]"<<std::endl;
00195 return EXIT_FAILURE;
00196 }
00197 else
00198 std::cout<<"[PASSED]"<<std::endl;
00199
00200 std::cout << "Testing to set output to NULL:";
00201 output = NULL;
00202 std::cout<<"[PASSED]"<<std::endl;
00203
00204 std::cout << "Testing reference count of filter:";
00205 if(filterWatcher->GetReferenceCount()!=0)
00206 {
00207 std::cout<<"[FAILED]"<<std::endl;
00208 return EXIT_FAILURE;
00209 }
00210 else
00211 std::cout<<"[PASSED]"<<std::endl;
00212
00213 std::cout << "Testing reference count of filter output:";
00214 if(filterOutputWatcher->GetReferenceCount()!=0)
00215 {
00216 std::cout<<"[FAILED]"<<std::endl;
00217 return EXIT_FAILURE;
00218 }
00219 else
00220 std::cout<<"[PASSED]"<<std::endl;
00221 }
00222 catch(...)
00223 {
00224 std::cout<<"[FAILED]"<<std::endl;
00225 return EXIT_FAILURE;
00226 }
00227
00228 std::cout << "Testing MITK_WEAKPOINTER_PROBLEM_WORKAROUND_ENABLED part4: "<<std::endl;
00229 try
00230 {
00231 mitk::Image::Pointer output;
00232 {
00233 typename FilterType::Pointer localFilter = FilterType::New();
00234 filterWatcher = new mitk::ReferenceCountWatcher(localFilter, "filter4");
00235 filterOutputWatcher = new mitk::ReferenceCountWatcher(localFilter->GetOutput(), "filter4Output");
00236 output = localFilter->GetOutput();
00237 std::cout << "Testing running out of scope of filter, keeping reference to output (as in part 3):";
00238 }
00239 std::cout<<"[PASSED]"<<std::endl;
00240
00241 std::cout << "Testing output->DisconnectPipeline(): ";
00242 output->DisconnectPipeline();
00243 std::cout<<"[PASSED]"<<std::endl;
00244
00245 std::cout << "Testing reference count of output: ";
00246 if(output->GetReferenceCount()!=1)
00247 {
00248 std::cout<<"[FAILED]"<<std::endl;
00249 return EXIT_FAILURE;
00250 }
00251 else
00252 std::cout<<"[PASSED]"<<std::endl;
00253 std::cout << "Testing external reference count of output: ";
00254 if(output->GetExternalReferenceCount()!=1)
00255 {
00256 std::cout<<"[FAILED]"<<std::endl;
00257 return EXIT_FAILURE;
00258 }
00259 else
00260 std::cout<<"[PASSED]"<<std::endl;
00261
00262 std::cout << "Testing reference count of filter:";
00263 if(filterWatcher->GetReferenceCount()!=0)
00264 {
00265 std::cout<<"[FAILED]"<<std::endl;
00266 return EXIT_FAILURE;
00267 }
00268 else
00269 std::cout<<"[PASSED]"<<std::endl;
00270
00271 std::cout << "Testing to set output to NULL:";
00272 output = NULL;
00273 std::cout<<"[PASSED]"<<std::endl;
00274
00275 std::cout << "Testing reference count of filter output:";
00276 if(filterOutputWatcher->GetReferenceCount()!=0)
00277 {
00278 std::cout<<"[FAILED]"<<std::endl;
00279 return EXIT_FAILURE;
00280 }
00281 else
00282 std::cout<<"[PASSED]"<<std::endl;
00283 }
00284 catch(...)
00285 {
00286 std::cout<<"[FAILED]"<<std::endl;
00287 return EXIT_FAILURE;
00288 }
00289
00290 std::cout << "Testing MITK_WEAKPOINTER_PROBLEM_WORKAROUND_ENABLED part5: "<<std::endl;
00291 try
00292 {
00293 {
00294 typename FilterType::Pointer localFilter = FilterType::New();
00295 filterWatcher = new mitk::ReferenceCountWatcher(localFilter, "filter5");
00296 filterOutputWatcher = new mitk::ReferenceCountWatcher(localFilter->GetOutput(), "filter5Output");
00297 std::cout << "Testing running out of scope of filter, keeping NO reference to output:";
00298 }
00299 std::cout<<"[PASSED]"<<std::endl;
00300
00301 std::cout << "Testing reference count of filter:";
00302 if(filterWatcher->GetReferenceCount()!=0)
00303 {
00304 std::cout<<"[FAILED]"<<std::endl;
00305 return EXIT_FAILURE;
00306 }
00307 else
00308 std::cout<<"[PASSED]"<<std::endl;
00309
00310 std::cout << "Testing reference count of filter output:";
00311 if(filterOutputWatcher->GetReferenceCount()!=0)
00312 {
00313 std::cout<<"[FAILED]"<<std::endl;
00314 return EXIT_FAILURE;
00315 }
00316 else
00317 std::cout<<"[PASSED]"<<std::endl;
00318 }
00319 catch(...)
00320 {
00321 std::cout<<"[FAILED]"<<std::endl;
00322 return EXIT_FAILURE;
00323 }
00324 return EXIT_SUCCESS;
00325
00326 }
00327
00328 int mitkPipelineSmartPointerCorrectnessTest(int , char* [])
00329 {
00330 int result;
00331 result = runPipelineSmartPointerCorrectnessTestForFilterType<mitk::SurfaceToImageFilter, mitk::Surface>(mitk::Surface::New());
00332 if( result != EXIT_SUCCESS )
00333 return result;
00334 std::cout << std::endl;
00335
00336 result = runPipelineSmartPointerCorrectnessTestForFilterType<mitk::GeometryClipImageFilter, mitk::Image>(mitk::Image::New());
00337 if( result != EXIT_SUCCESS )
00338 return result;
00339 std::cout << std::endl;
00340
00341 result = runPipelineSmartPointerCorrectnessTestForFilterType<TwoOutputsFilter, mitk::Surface>(mitk::Surface::New());
00342 if( result != EXIT_SUCCESS )
00343 return result;
00344
00345 result = runPipelineSmartPointerCorrectnessTestForFilterType<mitk::ImageSliceSelector, mitk::Image>(mitk::Image::New());
00346 if( result != EXIT_SUCCESS )
00347 return result;
00348
00349 std::cout<<"[TEST DONE]"<<std::endl;
00350 return EXIT_SUCCESS;
00351 }