Forráskód Böngészése

#357 Add test that fails with current CTK

New file path should be used even if instance UID is already
in the database.
Steve Pieper 11 éve
szülő
commit
f43ea84aa4

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

@@ -6,6 +6,7 @@ create_test_sourcelist(Tests ${KIT}CppTests.cpp
   ctkDICOMDatabaseTest2.cpp
   ctkDICOMDatabaseTest3.cpp
   ctkDICOMDatabaseTest4.cpp
+  ctkDICOMDatabaseTest5.cpp
   ctkDICOMItemTest1.cpp
   ctkDICOMIndexerTest1.cpp
   ctkDICOMModelTest1.cpp
@@ -37,6 +38,7 @@ SIMPLE_TEST(ctkDICOMDatabaseTest3
   ${CMAKE_CURRENT_SOURCE_DIR}/../../Resources/dicom-unversioned-schema.sql
   )
 SIMPLE_TEST(ctkDICOMDatabaseTest4 ${CTKData_DIR}/Data/DICOM/MRHEAD/000055.IMA)
+SIMPLE_TEST(ctkDICOMDatabaseTest5 ${CTKData_DIR}/Data/DICOM/MRHEAD/000055.IMA)
 SIMPLE_TEST(ctkDICOMItemTest1)
 SIMPLE_TEST(ctkDICOMIndexerTest1 )
 

+ 110 - 0
Libs/DICOM/Core/Testing/Cpp/ctkDICOMDatabaseTest5.cpp

@@ -0,0 +1,110 @@
+/*=========================================================================
+
+  Library:   CTK
+
+  Copyright (c) Kitware Inc.
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0.txt
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+=========================================================================*/
+
+// Qt includes
+#include <QCoreApplication>
+#include <QDir>
+
+// ctkDICOMCore includes
+#include "ctkDICOMDatabase.h"
+
+// STD includes
+#include <iostream>
+#include <cstdlib>
+
+
+int ctkDICOMDatabaseTest5( int argc, char * argv [] )
+{
+  QCoreApplication app(argc, argv);
+
+  if (argc < 2)
+    {
+    std::cerr << "ctkDICOMDatabaseTest2: missing dicom filePath argument";
+    std::cerr << std::endl;
+    return EXIT_FAILURE;
+    }
+
+  QString dicomFilePath(argv[1]);
+
+  ctkDICOMDatabase database;
+  QDir databaseDirectory = QDir::temp();
+  databaseDirectory.remove("ctkDICOMDatabase.sql");
+  databaseDirectory.remove("ctkDICOMTagCache.sql");
+
+  QFileInfo databaseFile(databaseDirectory, QString("database.test"));
+  database.openDatabase(databaseFile.absoluteFilePath());
+
+  bool res = database.initializeDatabase();
+
+  if (!res)
+    {
+    std::cerr << "ctkDICOMDatabase::initializeDatabase() failed." << std::endl;
+    return EXIT_FAILURE;
+    }
+  std::cerr << "Database is in " << databaseDirectory.path().toStdString() << std::endl;
+
+
+  //
+  // First, copy the passed file to two temp directories
+  //
+  databaseDirectory.rmdir("firstInsert");
+  databaseDirectory.rmdir("secondInsert");
+  databaseDirectory.mkdir("firstInsert");
+  databaseDirectory.mkdir("secondInsert");
+  QString firstDestination = QDir::cleanPath(databaseDirectory.absolutePath() + QDir::separator() + "firstInsert" + QDir::separator() + "file.dcm");
+  QString secondDestination = QDir::cleanPath(databaseDirectory.absolutePath() + QDir::separator() + "secondInsert" + QDir::separator() + "file.dcm");
+  QFile::copy(dicomFilePath, firstDestination);
+  std::cerr << "copied to: " << firstDestination.toStdString() << std::endl;
+  QFile::copy(dicomFilePath, secondDestination);
+  std::cerr << "copied to: " << secondDestination.toStdString() << std::endl;
+
+  //
+  // Insert the first instance
+  //
+  database.insert(firstDestination, false, false);
+
+  //
+  // Now delete the first instance and try inserting the second
+  //
+  QFile::remove(firstDestination);
+  database.insert(secondDestination, false, false);
+
+  //
+  // At this point, the file associated with the instance UID should be
+  // the secondDestination - it's an error if not.
+  //
+  QString instanceUID("1.2.840.113619.2.135.3596.6358736.4843.1115808177.83");
+  QString filePathInDatabase = database.fileForInstance(instanceUID);
+
+  if (filePathInDatabase != secondDestination)
+    {
+    std::cerr << "ctkDICOMDatabase thinks instance is in " << filePathInDatabase.toStdString() << std::endl;
+    std::cerr << "But we just inserted it from " << secondDestination.toStdString() << std::endl;
+    return EXIT_FAILURE;
+    }
+
+  //
+  // Close and clean up
+  //
+  database.closeDatabase();
+
+
+  return EXIT_SUCCESS;
+}