ctkDICOMBrowserTest.cpp 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299
  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.commontk.org/LICENSE
  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 <QApplication>
  16. #include <QComboBox>
  17. #include <QTest>
  18. // CTK includes
  19. #include "ctkDICOMDatabase.h"
  20. #include "ctkDICOMBrowser.h"
  21. #include "ctkFileDialog.h"
  22. #include "ctkScopedCurrentDir.h"
  23. #include "ctkTest.h"
  24. #include "ctkUtils.h"
  25. //-----------------------------------------------------------------------------
  26. class ctkDICOMBrowserTester: public QObject
  27. {
  28. Q_OBJECT
  29. private slots:
  30. void initTestCase();
  31. void init();
  32. void testDefaults();
  33. void testDatabaseDirectory();
  34. void testImportDirectoryMode();
  35. void testImportDirectories();
  36. void testImportDirectories_data();
  37. void testImportDirectory();
  38. void testImportDirectory_data();
  39. // Deprecated
  40. void testOnImportDirectory();
  41. void testOnImportDirectory_data();
  42. private:
  43. void _testImportCommon(ctkDICOMBrowser& browser);
  44. QString TemporaryDatabaseDirectoryName;
  45. QDir DICOMDir;
  46. };
  47. // ----------------------------------------------------------------------------
  48. void ctkDICOMBrowserTester::initTestCase()
  49. {
  50. // Get data directory from environment
  51. QDir dataDir = QDir(
  52. QProcessEnvironment::systemEnvironment().value("CTKData_DIR", ""));
  53. QVERIFY(dataDir.exists());
  54. this->DICOMDir = dataDir.filePath("Data/DICOM");
  55. QVERIFY(this->DICOMDir.exists());
  56. }
  57. // ----------------------------------------------------------------------------
  58. void ctkDICOMBrowserTester::init()
  59. {
  60. // If any, remove default ./ctkDICOM-Database directory
  61. {
  62. ctkScopedCurrentDir scopedCurrentDir(QDir::tempPath());
  63. ctk::removeDirRecursively("./ctkDICOM-Database");
  64. QCOMPARE(QFileInfo("./ctkDICOM-Database").isDir(), false);
  65. }
  66. // Generate a new database directory name
  67. this->TemporaryDatabaseDirectoryName =
  68. QString("ctkDICOMBrowserTest.%1.DICOM-Database").arg(QTime::currentTime().toString("hhmmsszzz"));
  69. }
  70. // ----------------------------------------------------------------------------
  71. void ctkDICOMBrowserTester::testDefaults()
  72. {
  73. // Clear left over settings
  74. QSettings().remove(ctkDICOMBrowser::databaseDirectorySettingsKey());
  75. ctkDICOMBrowser browser;
  76. QVERIFY(QFileInfo("./ctkDICOM-Database").isDir());
  77. QVERIFY(QFileInfo("./ctkDICOM-Database/ctkDICOM.sql").isFile());
  78. QVERIFY(QFileInfo("./ctkDICOM-Database/ctkDICOMTagCache.sql").isFile());
  79. QCOMPARE(ctkDICOMBrowser::databaseDirectorySettingsKey(), QString("DatabaseDirectory"));
  80. QCOMPARE(browser.databaseDirectory(), QString("./ctkDICOM-Database"));
  81. QVERIFY(browser.database() != 0);
  82. QCOMPARE(browser.tagsToPrecache(), QStringList());
  83. QVERIFY(browser.dicomTableManager() != 0);
  84. QCOMPARE(browser.displayImportSummary(), true);
  85. QCOMPARE(browser.patientsAddedDuringImport(), 0);
  86. QCOMPARE(browser.studiesAddedDuringImport(), 0);
  87. QCOMPARE(browser.seriesAddedDuringImport(), 0);
  88. QCOMPARE(browser.instancesAddedDuringImport(), 0);
  89. QCOMPARE(browser.importDirectoryMode(), ctkDICOMBrowser::ImportDirectoryAddLink);
  90. }
  91. // ----------------------------------------------------------------------------
  92. void ctkDICOMBrowserTester::testDatabaseDirectory()
  93. {
  94. // Check that value from setting is picked up
  95. {
  96. QSettings().setValue(ctkDICOMBrowser::databaseDirectorySettingsKey(), this->TemporaryDatabaseDirectoryName);
  97. QCOMPARE(QFileInfo(this->TemporaryDatabaseDirectoryName).isDir(), false);
  98. ctkDICOMBrowser browser;
  99. QCOMPARE(QFileInfo(browser.databaseDirectory()).absoluteFilePath(),
  100. QFileInfo(this->TemporaryDatabaseDirectoryName).absoluteFilePath());
  101. QVERIFY(QDir(browser.databaseDirectory()).exists());
  102. }
  103. }
  104. // ----------------------------------------------------------------------------
  105. void ctkDICOMBrowserTester::testImportDirectoryMode()
  106. {
  107. QSettings().setValue(ctkDICOMBrowser::databaseDirectorySettingsKey(), this->TemporaryDatabaseDirectoryName);
  108. ctkDICOMBrowser browser;
  109. browser.setImportDirectoryMode(ctkDICOMBrowser::ImportDirectoryCopy);
  110. QCOMPARE(browser.importDirectoryMode(), ctkDICOMBrowser::ImportDirectoryCopy);
  111. browser.setImportDirectoryMode(ctkDICOMBrowser::ImportDirectoryAddLink);
  112. QCOMPARE(browser.importDirectoryMode(), ctkDICOMBrowser::ImportDirectoryAddLink);
  113. QComboBox* comboBox = browser.importDialog()->bottomWidget()->findChild<QComboBox*>();
  114. comboBox->setCurrentIndex(comboBox->findData(ctkDICOMBrowser::ImportDirectoryCopy));
  115. QCOMPARE(browser.importDirectoryMode(), ctkDICOMBrowser::ImportDirectoryCopy);
  116. comboBox->setCurrentIndex(comboBox->findData(ctkDICOMBrowser::ImportDirectoryAddLink));
  117. QCOMPARE(browser.importDirectoryMode(), ctkDICOMBrowser::ImportDirectoryAddLink);
  118. }
  119. // ----------------------------------------------------------------------------
  120. void ctkDICOMBrowserTester::testImportDirectories()
  121. {
  122. QFETCH(QStringList, directories);
  123. QFETCH(ctkDICOMBrowser::ImportDirectoryMode, importDirectoryMode);
  124. QSettings().setValue(ctkDICOMBrowser::databaseDirectorySettingsKey(), this->TemporaryDatabaseDirectoryName);
  125. ctkDICOMBrowser browser;
  126. browser.setDisplayImportSummary(false);
  127. browser.importDirectories(directories, /* mode= */ importDirectoryMode);
  128. this->_testImportCommon(browser);
  129. }
  130. // ----------------------------------------------------------------------------
  131. void ctkDICOMBrowserTester::_testImportCommon(ctkDICOMBrowser& browser)
  132. {
  133. QFETCH(int, expectedImporedPatients);
  134. QFETCH(int, expectedImporedStudies);
  135. QFETCH(int, expectedImporedSeries);
  136. QFETCH(int, expectedImporedInstances);
  137. QCOMPARE(browser.patientsAddedDuringImport(), expectedImporedPatients);
  138. QCOMPARE(browser.studiesAddedDuringImport(), expectedImporedStudies);
  139. QCOMPARE(browser.seriesAddedDuringImport(), expectedImporedSeries);
  140. QCOMPARE(browser.instancesAddedDuringImport(), expectedImporedInstances);
  141. QFETCH(int, expectedTotalPatients);
  142. QFETCH(int, expectedTotalStudies);
  143. QFETCH(int, expectedTotalSeries);
  144. QFETCH(int, expectedTotalInstances);
  145. int currentPatientCount = 0;
  146. int currentStudyCount = 0;
  147. int currentSerieCount = 0;
  148. int currentInstanceCount = 0;
  149. QStringList patients = browser.database()->patients();
  150. currentPatientCount += patients.count();
  151. foreach(const QString& patient, patients)
  152. {
  153. QStringList studies = browser.database()->studiesForPatient(patient);
  154. currentStudyCount += studies.count();
  155. foreach(const QString& study, studies)
  156. {
  157. QStringList series = browser.database()->seriesForStudy(study);
  158. currentSerieCount += series.count();
  159. foreach(const QString& serie, series)
  160. {
  161. QStringList instances = browser.database()->instancesForSeries(serie);
  162. currentInstanceCount += instances.count();
  163. }
  164. }
  165. }
  166. QCOMPARE(currentPatientCount, expectedTotalPatients);
  167. QCOMPARE(currentStudyCount, expectedTotalStudies);
  168. QCOMPARE(currentSerieCount, expectedTotalSeries);
  169. QCOMPARE(currentInstanceCount, expectedTotalInstances);
  170. }
  171. // ----------------------------------------------------------------------------
  172. void ctkDICOMBrowserTester::testImportDirectories_data()
  173. {
  174. this->testImportDirectory_data();
  175. }
  176. // ----------------------------------------------------------------------------
  177. void ctkDICOMBrowserTester::testImportDirectory()
  178. {
  179. QFETCH(QStringList, directories);
  180. QFETCH(ctkDICOMBrowser::ImportDirectoryMode, importDirectoryMode);
  181. QSettings().setValue(ctkDICOMBrowser::databaseDirectorySettingsKey(), this->TemporaryDatabaseDirectoryName);
  182. ctkDICOMBrowser browser;
  183. browser.setDisplayImportSummary(false);
  184. browser.importDirectory(directories[0], /* mode= */ importDirectoryMode);
  185. this->_testImportCommon(browser);
  186. }
  187. // ----------------------------------------------------------------------------
  188. void ctkDICOMBrowserTester::testImportDirectory_data()
  189. {
  190. QTest::addColumn<QStringList>("directories");
  191. QTest::addColumn<ctkDICOMBrowser::ImportDirectoryMode>("importDirectoryMode");
  192. QTest::addColumn<int>("expectedImporedPatients");
  193. QTest::addColumn<int>("expectedImporedStudies");
  194. QTest::addColumn<int>("expectedImporedSeries");
  195. QTest::addColumn<int>("expectedImporedInstances");
  196. QTest::addColumn<int>("expectedTotalPatients");
  197. QTest::addColumn<int>("expectedTotalStudies");
  198. QTest::addColumn<int>("expectedTotalSeries");
  199. QTest::addColumn<int>("expectedTotalInstances");
  200. QTest::newRow("1-MRHEAD")
  201. << /* directories */ (QStringList() << this->DICOMDir.filePath("MRHEAD"))
  202. << /* importDirectoryMode */ ctkDICOMBrowser::ImportDirectoryAddLink
  203. << /* expectedImporedPatients */ 1
  204. << /* expectedImporedStudies */ 1
  205. << /* expectedImporedSeries */ 1
  206. << /* expectedImporedInstances */ 100
  207. << /* expectedTotalPatients */ 1
  208. << /* expectedTotalStudies */ 1
  209. << /* expectedTotalSeries */ 1
  210. << /* expectedTotalInstances */ 100;
  211. }
  212. // ----------------------------------------------------------------------------
  213. void ctkDICOMBrowserTester::testOnImportDirectory()
  214. {
  215. QFETCH(QStringList, directories);
  216. QFETCH(ctkDICOMBrowser::ImportDirectoryMode, importDirectoryMode);
  217. QSettings().setValue(ctkDICOMBrowser::databaseDirectorySettingsKey(), this->TemporaryDatabaseDirectoryName);
  218. ctkDICOMBrowser browser;
  219. browser.setDisplayImportSummary(false);
  220. browser.onImportDirectory(directories[0], /* mode= */ importDirectoryMode);
  221. this->_testImportCommon(browser);
  222. }
  223. // ----------------------------------------------------------------------------
  224. void ctkDICOMBrowserTester::testOnImportDirectory_data()
  225. {
  226. this->testImportDirectory_data();
  227. }
  228. // ----------------------------------------------------------------------------
  229. CTK_TEST_MAIN(ctkDICOMBrowserTest)
  230. #include "moc_ctkDICOMBrowserTest.cpp"