Selaa lähdekoodia

Add ctkDICOMDatabaseTest1 to unit test ctkDICOMDatabase

Don't crash when arguments pointers are NULL.
Julien Finet 14 vuotta sitten
vanhempi
commit
93a145732d

+ 3 - 0
Libs/DICOM/Core/Testing/Cpp/CMakeLists.txt

@@ -1,6 +1,7 @@
 SET(KIT ${PROJECT_NAME})
 
 CREATE_TEST_SOURCELIST(Tests ${KIT}CppTests.cpp
+  ctkDICOMDatabaseTest1.cpp
   ctkDICOMImageTest1.cpp
   ctkDICOMIndexerTest1.cpp
   ctkDICOMModelTest1.cpp
@@ -25,6 +26,8 @@ ENDMACRO( SIMPLE_TEST  )
 #
 # Add Tests
 #
+SIMPLE_TEST(ctkDICOMDatabaseTest1)
+
 ADD_TEST( ctkDICOMImageTest1 ${KIT_TESTS}
           ctkDICOMImageTest1 ${CTKData_DIR}/Data/DICOM/MRHEAD/000055.IMA)
 SET_PROPERTY(TEST ctkDICOMImageTest1 PROPERTY LABELS ${PROJECT_NAME})

+ 82 - 0
Libs/DICOM/Core/Testing/Cpp/ctkDICOMDatabaseTest1.cpp

@@ -0,0 +1,82 @@
+
+// Qt includes
+#include <QApplication>
+#include <QDir>
+#include <QTimer>
+
+// ctkDICOMCore includes
+#include "ctkDICOMDatabase.h"
+
+// STD includes
+#include <iostream>
+
+
+int ctkDICOMDatabaseTest1( int argc, char * argv [] )
+{
+  QApplication app(argc, argv);
+
+  ctkDICOMDatabase database;
+  QDir databaseDirectory = QDir::temp();
+  QFileInfo databaseFile(databaseDirectory, QString("database.test"));
+  database.openDatabase(databaseFile.absoluteFilePath());
+
+  if (!database.lastError().isEmpty())
+    {
+    std::cerr << "ctkDICOMDatabase::openDatabase() failed: "
+              << qPrintable(database.lastError()) << std::endl;
+    return EXIT_FAILURE;
+    }
+
+  if (!database.database().isValid())
+    {
+    std::cerr << "ctkDICOMDatabase::openDatabase() failed: "
+              << "invalid sql database" << std::endl;
+    return EXIT_FAILURE;
+    }
+
+  if (database.isInMemory())
+    {
+    std::cerr << "ctkDICOMDatabase::openDatabase() failed: "
+              << "database should not be in memory" << std::endl;
+    return EXIT_FAILURE;    
+    }
+
+  if (database.databaseFilename() != databaseFile.absoluteFilePath())
+    {
+    std::cerr << "ctkDICOMDatabase::databaseFilename() failed: "
+              << qPrintable( database.databaseFilename()) << std::endl;
+    return EXIT_FAILURE;
+    }
+
+  if (QDir(database.databaseDirectory()) != databaseDirectory)
+    {
+    std::cerr << "ctkDICOMDatabase::databaseDirectory() failed"
+              << qPrintable(database.databaseDirectory()) << std::endl;
+    return EXIT_FAILURE;
+    }
+
+  bool res = database.initializeDatabase();
+  
+  if (!res)
+    {
+    std::cerr << "ctkDICOMDatabase::initializeDatabase() failed." << std::endl;
+    return EXIT_FAILURE;
+    }
+
+  // check if it doesn't crash
+  database.pathForDataset(0);
+  database.insert(0, true, true);
+  database.insert(0, true, false);
+  database.insert(0, false, false);
+  database.insert(0, false, true);
+
+  database.closeDatabase();
+  database.initializeDatabase();
+
+  if (argc <= 1 || QString(argv[1]) != "-I")
+    {
+    QTimer::singleShot(200, &app, SLOT(quit()));
+    }
+
+  return app.exec();
+}

+ 11 - 2
Libs/DICOM/Core/ctkDICOMDatabase.cpp

@@ -230,9 +230,14 @@ void ctkDICOMDatabase::insert ( DcmDataset *dataset ) {
 */
 
 //------------------------------------------------------------------------------
-void ctkDICOMDatabase::insert ( DcmDataset *dataset, bool storeFile, bool createThumbnail ) {
+void ctkDICOMDatabase::insert ( DcmDataset *dataset, bool storeFile, bool createThumbnail )
+{
   Q_D(ctkDICOMDatabase);
 
+  if (!dataset)
+    {
+    return;
+    }
   // Check to see if the file has already been loaded
   OFString sopInstanceUID ;
   dataset->findAndGetOFString(DCM_SOPInstanceUID, sopInstanceUID);
@@ -437,7 +442,7 @@ void ctkDICOMDatabase::insert ( DcmDataset *dataset, bool storeFile, bool create
       // TODO: reuse dataset
       DicomImage dcmtkImage(filename.toAscii());
       ctkDICOMImage ctkImage(&dcmtkImage);
-      QImage image( ctkImage.getImage(0) );
+      QImage image( ctkImage.frame(0) );
       image.scaled(128,128,Qt::KeepAspectRatio).save(thumbnailFilename,"PNG");
     }
   }
@@ -459,6 +464,10 @@ QString ctkDICOMDatabase::pathForDataset( DcmDataset *dataset)
 {
   Q_D(ctkDICOMDatabase);
 
+  if (!dataset)
+    {
+    return QString();
+    }
   OFString studyInstanceUID, seriesInstanceUID, sopInstanceUID;
   dataset->findAndGetOFString(DCM_StudyInstanceUID, studyInstanceUID);
   dataset->findAndGetOFString(DCM_SeriesInstanceUID, seriesInstanceUID);

+ 1 - 0
Libs/DICOM/Core/ctkDICOMDatabase.h

@@ -72,6 +72,7 @@ public:
 
 signals:
   void databaseChanged();
+
 protected:
   QScopedPointer<ctkDICOMDatabasePrivate> d_ptr;