Quellcode durchsuchen

Implement and test comparison operators associated with ctkDicomAppHostingTypes

Jean-Christophe Fillion-Robin vor 14 Jahren
Ursprung
Commit
a568cffe55

+ 6 - 1
Plugins/org.commontk.dah.core/CMakeLists.txt

@@ -5,7 +5,7 @@ SET(PLUGIN_export_directive "org_commontk_dah_core_EXPORT")
 SET(PLUGIN_SRCS
   ctkDicomAppHostingCorePlugin.cpp
   ctkDicomAppHostingCorePlugin_p.h
-  ctkDicomAppHostingTypes.h
+  ctkDicomAppHostingTypes.cpp
   ctkDicomAppHostingTypesHelper.cpp
   ctkDicomAppInterface.h
   ctkDicomExchangeInterface.h
@@ -50,3 +50,8 @@ ctkMacroBuildPlugin(
   RESOURCES ${PLUGIN_resources}
   TARGET_LIBRARIES ${PLUGIN_target_libraries}
 )
+
+IF(BUILD_TESTING)
+  ADD_SUBDIRECTORY(Testing)
+ENDIF()
+

+ 1 - 0
Plugins/org.commontk.dah.core/Testing/CMakeLists.txt

@@ -0,0 +1 @@
+ADD_SUBDIRECTORY(Cpp)

+ 26 - 0
Plugins/org.commontk.dah.core/Testing/Cpp/CMakeLists.txt

@@ -0,0 +1,26 @@
+SET(KIT ${PROJECT_NAME})
+
+CREATE_TEST_SOURCELIST(Tests ${KIT}CppTests.cxx
+  ctkDicomAppHostingTypesTest1.cpp
+  )
+
+SET (TestsToRun ${Tests})
+REMOVE (TestsToRun ${KIT}CppTests.cxx)
+
+SET(LIBRARY_NAME ${PROJECT_NAME})
+
+ADD_EXECUTABLE(${KIT}CppTests ${Tests})
+TARGET_LINK_LIBRARIES(${KIT}CppTests ${LIBRARY_NAME})
+
+SET(KIT_TESTS ${CPP_TEST_PATH}/${KIT}CppTests)
+
+MACRO( SIMPLE_TEST  TESTNAME )
+  ADD_TEST( ${TESTNAME} ${KIT_TESTS} ${TESTNAME} )
+  SET_PROPERTY(TEST ${TESTNAME} PROPERTY LABELS ${PROJECT_NAME})
+ENDMACRO( SIMPLE_TEST )
+
+#
+# Add Tests
+#
+
+SIMPLE_TEST( ctkDicomAppHostingTypesTest1 )

+ 274 - 0
Plugins/org.commontk.dah.core/Testing/Cpp/ctkDicomAppHostingTypesTest1.cpp

@@ -0,0 +1,274 @@
+
+// CTK includes
+#include <ctkDicomAppHostingTypes.h>
+
+// STD includes
+#include <cstdlib>
+#include <iostream>
+
+namespace
+{
+//----------------------------------------------------------------------------
+template<typename STRUCT>
+bool verifyOperator(const STRUCT& left, const STRUCT& right, bool equalExpected)
+{
+  bool equal = (left == right);
+  bool different = (left != right);
+
+  if (equalExpected)
+    {
+    if (!equal)
+      {
+      return false;
+      }
+    if (different)
+      {
+      return false;
+      }
+    }
+  else
+    {
+    if (equal)
+      {
+      return false;
+      }
+    if (!different)
+      {
+      return false;
+      }
+    }
+  return true;
+}
+}
+
+//----------------------------------------------------------------------------
+#define CHECK_OP(TYPE, LEFT, RIGHT, EQUAL_EXPECTED)        \
+  if (!verifyOperator<ctkDicomAppHosting::TYPE>(           \
+        LEFT, RIGHT, /*equalExpected=*/ EQUAL_EXPECTED))   \
+    {                                                      \
+    std::cerr << "Line "                                   \
+              << __LINE__ << " - Problem with " << #TYPE   \
+              << " comparison operator" << std::endl;      \
+    return EXIT_FAILURE;                                   \
+    }
+
+//----------------------------------------------------------------------------
+int ctkDicomAppHostingTypesTest1(int argc, char* argv[])
+{
+  Q_UNUSED(argc);
+  Q_UNUSED(argv);
+
+  //----------------------------------------------------------------------------
+  ctkDicomAppHosting::Status status1;
+  ctkDicomAppHosting::Status status2;
+  CHECK_OP(Status, status1, status2, /*EQUAL_EXPECTED=*/ true);
+
+  status2.codeMeaning = "codeMeaning";
+  CHECK_OP(Status, status1, status2, /*EQUAL_EXPECTED=*/ false);
+
+  status2.codeMeaning = "";
+  CHECK_OP(Status, status1, status2, /*EQUAL_EXPECTED=*/ true);
+
+  status2.codeValue = "codeValue";
+  CHECK_OP(Status, status1, status2, /*EQUAL_EXPECTED=*/ false);
+
+  status2.codeValue = "";
+  CHECK_OP(Status, status1, status2, /*EQUAL_EXPECTED=*/ true);
+
+  status2.codingSchemeDesignator = "codingSchemeDesignator";
+  CHECK_OP(Status, status1, status2, /*EQUAL_EXPECTED=*/ false);
+
+  status2.codingSchemeDesignator = "";
+  CHECK_OP(Status, status1, status2, /*EQUAL_EXPECTED=*/ true);
+
+  status2.statusType = ctkDicomAppHosting::FATALERROR;
+  CHECK_OP(Status, status1, status2, /*EQUAL_EXPECTED=*/ false);
+
+  status2.statusType = ctkDicomAppHosting::INFORMATION;
+  CHECK_OP(Status, status1, status2, /*EQUAL_EXPECTED=*/ true);
+
+  //----------------------------------------------------------------------------
+  ctkDicomAppHosting::ObjectLocator objectLocator1;
+  ctkDicomAppHosting::ObjectLocator objectLocator2;
+  CHECK_OP(ObjectLocator, objectLocator1, objectLocator2, /*EQUAL_EXPECTED=*/ true);
+
+  objectLocator2.length = 64;
+  CHECK_OP(ObjectLocator, objectLocator1, objectLocator2, /*EQUAL_EXPECTED=*/ false);
+
+  objectLocator2.length = 0;
+  CHECK_OP(ObjectLocator, objectLocator1, objectLocator2, /*EQUAL_EXPECTED=*/ true);
+
+  objectLocator2.locator = "locator";
+  CHECK_OP(ObjectLocator, objectLocator1, objectLocator2, /*EQUAL_EXPECTED=*/ false);
+
+  objectLocator2.locator = "";
+  CHECK_OP(ObjectLocator, objectLocator1, objectLocator2, /*EQUAL_EXPECTED=*/ true);
+
+  objectLocator2.offset = 100;
+  CHECK_OP(ObjectLocator, objectLocator1, objectLocator2, /*EQUAL_EXPECTED=*/ false);
+
+  objectLocator2.offset = 0;
+  CHECK_OP(ObjectLocator, objectLocator1, objectLocator2, /*EQUAL_EXPECTED=*/ true);
+
+  objectLocator2.source = "source";
+  CHECK_OP(ObjectLocator, objectLocator1, objectLocator2, /*EQUAL_EXPECTED=*/ false);
+
+  objectLocator2.source = "";
+  CHECK_OP(ObjectLocator, objectLocator1, objectLocator2, /*EQUAL_EXPECTED=*/ true);
+
+  objectLocator2.transferSyntax = "transferSyntax";
+  CHECK_OP(ObjectLocator, objectLocator1, objectLocator2, /*EQUAL_EXPECTED=*/ false);
+
+  objectLocator2.transferSyntax = "";
+  CHECK_OP(ObjectLocator, objectLocator1, objectLocator2, /*EQUAL_EXPECTED=*/ true);
+
+  objectLocator2.URI = "URI";
+  CHECK_OP(ObjectLocator, objectLocator1, objectLocator2, /*EQUAL_EXPECTED=*/ false);
+
+  objectLocator2.URI = "";
+  CHECK_OP(ObjectLocator, objectLocator1, objectLocator2, /*EQUAL_EXPECTED=*/ true);
+  
+  //----------------------------------------------------------------------------
+  ctkDicomAppHosting::ObjectDescriptor objectDescriptor1;
+  ctkDicomAppHosting::ObjectDescriptor objectDescriptor2;
+  CHECK_OP(ObjectDescriptor, objectDescriptor1, objectDescriptor2, /*EQUAL_EXPECTED=*/ true);
+  
+  objectDescriptor2.classUID = "classUID";
+  CHECK_OP(ObjectDescriptor, objectDescriptor1, objectDescriptor2, /*EQUAL_EXPECTED=*/ false);
+
+  objectDescriptor2.classUID = "";
+  CHECK_OP(ObjectDescriptor, objectDescriptor1, objectDescriptor2, /*EQUAL_EXPECTED=*/ true);
+
+  objectDescriptor2.descriptorUUID = "descriptorUUID";
+  CHECK_OP(ObjectDescriptor, objectDescriptor1, objectDescriptor2, /*EQUAL_EXPECTED=*/ false);
+
+  objectDescriptor2.descriptorUUID = "";
+  CHECK_OP(ObjectDescriptor, objectDescriptor1, objectDescriptor2, /*EQUAL_EXPECTED=*/ true);
+
+  objectDescriptor2.mimeType = "mimeType";
+  CHECK_OP(ObjectDescriptor, objectDescriptor1, objectDescriptor2, /*EQUAL_EXPECTED=*/ false);
+
+  objectDescriptor2.mimeType = "";
+  CHECK_OP(ObjectDescriptor, objectDescriptor1, objectDescriptor2, /*EQUAL_EXPECTED=*/ true);
+
+  objectDescriptor2.modality = "modality";
+  CHECK_OP(ObjectDescriptor, objectDescriptor1, objectDescriptor2, /*EQUAL_EXPECTED=*/ false);
+
+  objectDescriptor2.modality = "";
+  CHECK_OP(ObjectDescriptor, objectDescriptor1, objectDescriptor2, /*EQUAL_EXPECTED=*/ true);
+
+  objectDescriptor2.transferSyntaxUID = "transferSyntaxUID";
+  CHECK_OP(ObjectDescriptor, objectDescriptor1, objectDescriptor2, /*EQUAL_EXPECTED=*/ false);
+
+  objectDescriptor2.transferSyntaxUID = "";
+  CHECK_OP(ObjectDescriptor, objectDescriptor1, objectDescriptor2, /*EQUAL_EXPECTED=*/ true);
+
+  //----------------------------------------------------------------------------
+  ctkDicomAppHosting::Series series1;
+  ctkDicomAppHosting::Series series2;
+  CHECK_OP(Series, series1, series2, /*EQUAL_EXPECTED=*/ true);
+
+  series2.seriesUID = "studyUID";
+  CHECK_OP(Series, series1, series2, /*EQUAL_EXPECTED=*/ false);
+
+  series2.seriesUID = "";
+  CHECK_OP(Series, series1, series2, /*EQUAL_EXPECTED=*/ true);
+
+  series2.objectDescriptors << objectDescriptor1 << objectDescriptor2;
+  CHECK_OP(Series, series1, series2, /*EQUAL_EXPECTED=*/ false);
+
+  series1.objectDescriptors << objectDescriptor1 << objectDescriptor2;
+  CHECK_OP(Series, series1, series2, /*EQUAL_EXPECTED=*/ true);
+
+  series1.objectDescriptors.clear();
+  CHECK_OP(Series, series1, series2, /*EQUAL_EXPECTED=*/ false);
+
+  series2.objectDescriptors.clear();
+  CHECK_OP(Series, series1, series2, /*EQUAL_EXPECTED=*/ true);
+
+  //----------------------------------------------------------------------------
+  ctkDicomAppHosting::Study study1;
+  ctkDicomAppHosting::Study study2;
+  CHECK_OP(Study, study1, study2, /*EQUAL_EXPECTED=*/ true);
+
+  study1.series << series1 << series2;
+  CHECK_OP(Study, study1, study2, /*EQUAL_EXPECTED=*/ false);
+
+  study2.series << series1 << series2;
+  CHECK_OP(Study, study1, study2, /*EQUAL_EXPECTED=*/ true);
+
+  study2.studyUID = "studyUID";
+  CHECK_OP(Study, study1, study2, /*EQUAL_EXPECTED=*/ false);
+
+  study2.studyUID = "";
+  CHECK_OP(Study, study1, study2, /*EQUAL_EXPECTED=*/ true);
+
+  study2.objectDescriptors << objectDescriptor1 << objectDescriptor2;
+  CHECK_OP(Study, study1, study2, /*EQUAL_EXPECTED=*/ false);
+
+  study1.objectDescriptors << objectDescriptor1 << objectDescriptor2;
+  CHECK_OP(Study, study1, study2, /*EQUAL_EXPECTED=*/ true);
+
+  study1.objectDescriptors.clear();
+  CHECK_OP(Study, study1, study2, /*EQUAL_EXPECTED=*/ false);
+
+  study2.objectDescriptors.clear();
+  CHECK_OP(Study, study1, study2, /*EQUAL_EXPECTED=*/ true);
+
+  //----------------------------------------------------------------------------
+  ctkDicomAppHosting::Patient patient1;
+  ctkDicomAppHosting::Patient patient2;
+  CHECK_OP(Patient, patient1, patient2, /*EQUAL_EXPECTED=*/ true);
+
+  patient2.assigningAuthority = "assigningAuthority";
+  CHECK_OP(Patient, patient1, patient2, /*EQUAL_EXPECTED=*/ false);
+
+  patient2.assigningAuthority = "";
+  CHECK_OP(Patient, patient1, patient2, /*EQUAL_EXPECTED=*/ true);
+
+  patient2.birthDate = "birthDate";
+  CHECK_OP(Patient, patient1, patient2, /*EQUAL_EXPECTED=*/ false);
+
+  patient2.birthDate = "";
+  CHECK_OP(Patient, patient1, patient2, /*EQUAL_EXPECTED=*/ true);
+
+  patient2.id = "id";
+  CHECK_OP(Patient, patient1, patient2, /*EQUAL_EXPECTED=*/ false);
+
+  patient2.id = "";
+  CHECK_OP(Patient, patient1, patient2, /*EQUAL_EXPECTED=*/ true);
+
+  patient2.name = "name";
+  CHECK_OP(Patient, patient1, patient2, /*EQUAL_EXPECTED=*/ false);
+
+  patient2.name = "";
+  CHECK_OP(Patient, patient1, patient2, /*EQUAL_EXPECTED=*/ true);
+
+  patient2.sex = "sex";
+  CHECK_OP(Patient, patient1, patient2, /*EQUAL_EXPECTED=*/ false);
+
+  patient2.sex = "";
+  CHECK_OP(Patient, patient1, patient2, /*EQUAL_EXPECTED=*/ true);
+
+  //----------------------------------------------------------------------------
+  ctkDicomAppHosting::AvailableData availableData1;
+  ctkDicomAppHosting::AvailableData availableData2;
+  CHECK_OP(AvailableData, availableData1, availableData2, /*EQUAL_EXPECTED=*/ true);
+
+  ctkDicomAppHosting::Patient p1;
+  p1.name = "name";
+  p1.studies << study1 << study2;
+
+  ctkDicomAppHosting::Patient p2;
+  p2.name = "name";
+  p2.studies << study1 << study2;
+  CHECK_OP(Patient, p1, p2, /*EQUAL_EXPECTED=*/ true);
+
+  availableData1.patients << p1 << p2;
+  CHECK_OP(AvailableData, availableData1, availableData2, /*EQUAL_EXPECTED=*/ false);
+
+  availableData2.patients << p1 << p2;
+  CHECK_OP(AvailableData, availableData1, availableData2, /*EQUAL_EXPECTED=*/ true);
+  
+  return EXIT_SUCCESS;
+}

+ 66 - 7
Plugins/org.commontk.dah.core/ctkDicomAppHostingTypes.h

@@ -19,25 +19,29 @@
 
 =============================================================================*/
 
-#include <QString>
-#include <QList>
-
 #ifndef CTKDICOMAPPHOSTINGTYPES_H
 #define CTKDICOMAPPHOSTINGTYPES_H
 
+// Qt includes
+#include <QString>
+#include <QList>
+
 #ifdef ERROR
-#error Try to reorder include files (this one first)\
- or write #undef ERROR before including this header.\
- Cause of this problem may be dcmimage.h, which indirectly\
+# error Try to reorder include files (this one first)       \
+ or write #undef ERROR before including this header.        \
+ Cause of this problem may be dcmimage.h, which indirectly  \
  includes windows.h.
 #endif
 
+#include <org_commontk_dah_core_Export.h>
+
 /**
   * \brief Typedefs and classes defined in the interfaces of DICOM Supplement 118.
   *
   */
 namespace ctkDicomAppHosting {
 
+  //----------------------------------------------------------------------------
   enum State {
     IDLE,
     INPROGRESS,
@@ -47,6 +51,7 @@ namespace ctkDicomAppHosting {
     EXIT
   };
 
+  //----------------------------------------------------------------------------
   enum StatusType {
     INFORMATION,
     WARNING,
@@ -54,14 +59,18 @@ namespace ctkDicomAppHosting {
     FATALERROR
   };
 
+  //----------------------------------------------------------------------------
   struct Status {
+    Status():statusType(INFORMATION){}
     StatusType statusType;
     QString codingSchemeDesignator;
     QString codeValue;
     QString codeMeaning;
   };
 
+  //----------------------------------------------------------------------------
   struct ObjectLocator {
+    ObjectLocator():length(0), offset(0){}
     QString locator;
     QString source;
     QString transferSyntax;
@@ -70,6 +79,7 @@ namespace ctkDicomAppHosting {
     QString URI;
   };
 
+  //----------------------------------------------------------------------------
   struct ObjectDescriptor {
     QString descriptorUUID;
     QString mimeType;
@@ -78,19 +88,23 @@ namespace ctkDicomAppHosting {
     QString modality;
   };
 
+  //----------------------------------------------------------------------------
   typedef QList<ObjectDescriptor> ArrayOfObjectDescriptors;
 
+  //----------------------------------------------------------------------------
   struct Series {
     QString seriesUID;
     ArrayOfObjectDescriptors objectDescriptors;
   };
 
+  //----------------------------------------------------------------------------
   struct Study {
     QString studyUID;
     ArrayOfObjectDescriptors objectDescriptors;
     QList<Series> series;
   };
 
+  //----------------------------------------------------------------------------
   struct Patient {
     QString name;
     QString id;
@@ -101,11 +115,56 @@ namespace ctkDicomAppHosting {
     QList<Study> studies;
   };
 
+  //----------------------------------------------------------------------------
   struct AvailableData {
     ArrayOfObjectDescriptors objectDescriptors;
     QList<Patient> patients;
   };
-
 }
 
+//----------------------------------------------------------------------------
+// Comparison operators
+
+bool org_commontk_dah_core_EXPORT operator ==(const ctkDicomAppHosting::Status& left,
+                                              const ctkDicomAppHosting::Status& right);
+
+bool org_commontk_dah_core_EXPORT operator !=(const ctkDicomAppHosting::Status& left,
+                                              const ctkDicomAppHosting::Status& right);
+
+bool org_commontk_dah_core_EXPORT operator ==(const ctkDicomAppHosting::ObjectLocator& left,
+                                              const ctkDicomAppHosting::ObjectLocator& right);
+
+bool org_commontk_dah_core_EXPORT operator !=(const ctkDicomAppHosting::ObjectLocator& left,
+                                              const ctkDicomAppHosting::ObjectLocator& right);
+
+bool org_commontk_dah_core_EXPORT operator ==(const ctkDicomAppHosting::ObjectDescriptor& left,
+                                              const ctkDicomAppHosting::ObjectDescriptor& right);
+
+bool org_commontk_dah_core_EXPORT operator !=(const ctkDicomAppHosting::ObjectDescriptor& left,
+                                              const ctkDicomAppHosting::ObjectDescriptor& right);
+
+bool org_commontk_dah_core_EXPORT operator ==(const ctkDicomAppHosting::Series& left,
+                                              const ctkDicomAppHosting::Series& right);
+
+bool org_commontk_dah_core_EXPORT operator !=(const ctkDicomAppHosting::Series& left,
+                                              const ctkDicomAppHosting::Series& right);
+
+bool org_commontk_dah_core_EXPORT operator ==(const ctkDicomAppHosting::Study& left,
+                                              const ctkDicomAppHosting::Study& right);
+
+bool org_commontk_dah_core_EXPORT operator !=(const ctkDicomAppHosting::Study& left,
+                                              const ctkDicomAppHosting::Study& right);
+
+bool org_commontk_dah_core_EXPORT operator ==(const ctkDicomAppHosting::Patient& left,
+                                              const ctkDicomAppHosting::Patient& right);
+
+bool org_commontk_dah_core_EXPORT operator !=(const ctkDicomAppHosting::Patient& left,
+                                              const ctkDicomAppHosting::Patient& right);
+
+bool org_commontk_dah_core_EXPORT operator ==(const ctkDicomAppHosting::AvailableData& left,
+                                              const ctkDicomAppHosting::AvailableData& right);
+
+bool org_commontk_dah_core_EXPORT operator !=(const ctkDicomAppHosting::AvailableData& left,
+                                              const ctkDicomAppHosting::AvailableData& right);
+
 #endif // CTKDICOMAPPHOSTINGTYPES