ctkDICOMDatabaseTest4.cpp 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. /*=========================================================================
  2. Library: CTK
  3. Copyright (c) Kitware Inc.
  4. Licensed under the Apache License, Version 2.0 (the "License");
  5. you may not use this file except in compliance with the License.
  6. You may obtain a copy of the License at
  7. http://www.apache.org/licenses/LICENSE-2.0.txt
  8. Unless required by applicable law or agreed to in writing, software
  9. distributed under the License is distributed on an "AS IS" BASIS,
  10. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  11. See the License for the specific language governing permissions and
  12. limitations under the License.
  13. =========================================================================*/
  14. // Qt includes
  15. #include <QCoreApplication>
  16. #include <QDir>
  17. // ctkDICOMCore includes
  18. #include "ctkDICOMDatabase.h"
  19. // STD includes
  20. #include <iostream>
  21. #include <cstdlib>
  22. int ctkDICOMDatabaseTest4( int argc, char * argv [] )
  23. {
  24. QCoreApplication app(argc, argv);
  25. if (argc < 2)
  26. {
  27. std::cerr << "ctkDICOMDatabaseTest2: missing dicom filePath argument";
  28. std::cerr << std::endl;
  29. return EXIT_FAILURE;
  30. }
  31. QString dicomFilePath(argv[1]);
  32. ctkDICOMDatabase database;
  33. QDir databaseDirectory = QDir::temp();
  34. databaseDirectory.remove("ctkDICOMDatabase.sql");
  35. databaseDirectory.remove("ctkDICOMTagCache.sql");
  36. QFileInfo databaseFile(databaseDirectory, QString("database.test"));
  37. database.openDatabase(databaseFile.absoluteFilePath());
  38. bool res = database.initializeDatabase();
  39. if (!res)
  40. {
  41. std::cerr << "ctkDICOMDatabase::initializeDatabase() failed." << std::endl;
  42. return EXIT_FAILURE;
  43. }
  44. //
  45. // Basic test:
  46. // - insert the file specified on the command line
  47. // - ask for tag values and compare to known results
  48. //
  49. QString instanceUID("1.2.840.113619.2.135.3596.6358736.4843.1115808177.83");
  50. QString tag("0008,103e");
  51. QString badTag("9999,9999");
  52. //
  53. // Test the precache feature of the database
  54. //
  55. if (database.cachedTag(instanceUID, tag) != QString(""))
  56. {
  57. std::cerr << "ctkDICOMDatabase: tag cache should return empty string for unknown instance tag" << std::endl;
  58. return EXIT_FAILURE;
  59. }
  60. if (database.cachedTag(instanceUID, badTag) != QString(""))
  61. {
  62. std::cerr << "ctkDICOMDatabase: bad tag cache should return empty string for unknown instance tag" << std::endl;
  63. return EXIT_FAILURE;
  64. }
  65. QStringList tagsToPrecache;
  66. tagsToPrecache << tag;
  67. database.setTagsToPrecache(tagsToPrecache);
  68. if (database.tagsToPrecache() != tagsToPrecache)
  69. {
  70. std::cerr << "ctkDICOMDatabase: tags to precache not correct" << std::endl;
  71. return EXIT_FAILURE;
  72. }
  73. // check the insert timestamp
  74. QDateTime beforeInsert = QDateTime::currentDateTime();
  75. std::cerr << "Current dateTime " << beforeInsert.toString().toStdString() << std::endl;
  76. database.insert(dicomFilePath, false, false);
  77. QDateTime insertTimeStamp = database.insertDateTimeForInstance(instanceUID);
  78. std::cerr << "Instance inserted " << insertTimeStamp.toString().toStdString() << std::endl;
  79. QString filePath = database.fileForInstance(instanceUID);
  80. std::cerr << "Instance file " << filePath.toStdString() << std::endl;
  81. int elapsed = beforeInsert.secsTo(insertTimeStamp);
  82. if (elapsed > 1)
  83. {
  84. std::cerr << "ctkDICOMDatabase: Took more than a second to insert the file." << std::endl;
  85. return EXIT_FAILURE;
  86. }
  87. // check for series description in tag cache
  88. QString knownSeriesDescription("3D Cor T1 FAST IR-prepped GRE");
  89. QString cachedTag = database.cachedTag(instanceUID, tag);
  90. if (cachedTag != knownSeriesDescription)
  91. {
  92. std::cerr << "ctkDICOMDatabase: tag cache should return known value for instance" << std::endl;
  93. return EXIT_FAILURE;
  94. }
  95. if (database.instanceValue(instanceUID, tag) != knownSeriesDescription)
  96. {
  97. std::cerr << "ctkDICOMDatabase: database should return known value for instance" << std::endl;
  98. return EXIT_FAILURE;
  99. }
  100. if (database.instanceValue(instanceUID, badTag) != QString(""))
  101. {
  102. std::cerr << "ctkDICOMDatabase: bad tag should have empty value" << std::endl;
  103. return EXIT_FAILURE;
  104. }
  105. if (database.cachedTag(instanceUID, badTag) != QString("__TAG_NOT_IN_INSTANCE__"))
  106. {
  107. std::cerr << "ctkDICOMDatabase: bad tag should have sentinal value in cache" << std::endl;
  108. return EXIT_FAILURE;
  109. }
  110. database.closeDatabase();
  111. std::cerr << "Database is in " << databaseDirectory.path().toStdString() << std::endl;
  112. return EXIT_SUCCESS;
  113. }