int ctkDICOMDatabaseTest6( int argc, char * argv [] ) { QCoreApplication app(argc, argv); if (argc < 2) { std::cerr << "ctkDICOMDatabaseTest6: 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; } // // Basic test: // - insert the file specified on the command line // - ask for name and descriptions and compare to known results // QString instanceUID("1.2.840.113619.2.135.3596.6358736.4843.1115808177.83"); // // Test the pre load values feature of the database // QString preInsertDescription = database.descriptionForSeries(instanceUID); if (!preInsertDescription.isEmpty()) { std::cerr << "ctkDICOMDatabase: db should return empty string for unknown " << " instance series description, instead got: " << preInsertDescription.toStdString() << std::endl; return EXIT_FAILURE; } database.insert(dicomFilePath, false, false); QString filePath = database.fileForInstance(instanceUID); std::cerr << "Instance file " << filePath.toStdString() << std::endl; // check for descriptions QHash<QString,QString> descriptions (database.descriptionsForFile(filePath)); std::cout << "\tPatient Name: " << descriptions["PatientsName"].toStdString() << "\n\tStudy Desciption: " << descriptions["StudyDescription"].toStdString() << "\n\tSeries Desciption: " << descriptions["SeriesDescription"].toStdString() << std::endl; // check for known series description QString knownSeriesDescription("3D Cor T1 FAST IR-prepped GRE"); QString seriesUID = database.seriesForFile(filePath); QString seriesDescription = database.descriptionForSeries(seriesUID); if (seriesDescription != knownSeriesDescription) { std::cerr << "ctkDICOMDatabase: database should return series description of '" << knownSeriesDescription.toStdString() << "', instead returned '" << seriesDescription.toStdString() << "'\n\tinstanceUID = " << instanceUID.toStdString() << "\n\tseriesUID = " << seriesUID.toStdString() << std::endl; return EXIT_FAILURE; } // get the study and patient uids QString patientUID, studyUID; studyUID = database.studyForSeries(seriesUID); patientUID = database.patientForStudy(studyUID); // check for empty study description QString studyDescription = database.descriptionForStudy(studyUID); if (!studyDescription.isEmpty()) { std::cerr << "ctkDICOMDatabase: database should return empty study" << " description for studyUID of " << studyUID.toStdString() << ", instead returned '" << studyDescription.toStdString() << "'" << std::endl; return EXIT_FAILURE; } // check for known patient name QString knownPatientName("Facial Expression"); QString patientName = database.nameForPatient(patientUID); if (patientName != knownPatientName) { std::cerr << "ctkDICOMDatabase: database should return known patient name '" << knownPatientName.toStdString() << "' for patient UID of " << patientUID.toStdString() << ", instead returned '" << patientName.toStdString() << "'" << std::endl; return EXIT_FAILURE; } database.closeDatabase(); std::cerr << "Database is in " << databaseDirectory.path().toStdString() << std::endl; return EXIT_SUCCESS; }
int ctkDICOMDatabaseTest2( 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()); 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; } bool res = database.initializeDatabase(); if (!res) { std::cerr << "ctkDICOMDatabase::initializeDatabase() failed." << std::endl; return EXIT_FAILURE; } // // Test that the tag interface works to parse ascii // QString tag("0008,103e"); unsigned short group, element; if ( !database.tagToGroupElement(tag, group, element) ) { std::cerr << "ctkDICOMDatabase: could not parse tag" << std::endl; return EXIT_FAILURE; } if ( group != 0x8 || element != 0x103e ) { std::cerr << "ctkDICOMDatabase: expected: " << "0008,103e" << std::endl; std::cerr << "ctkDICOMDatabase: got: " << group << " " << element << std::endl; std::cerr << "ctkDICOMDatabase: parsed tag does not match group/element" << std::endl; return EXIT_FAILURE; } if ( database.groupElementToTag(group, element) != tag ) { std::cerr << "ctkDICOMDatabase: could not convert a uints to tag string" << std::endl; return EXIT_FAILURE; } // // Basic test: // - insert the file specified on the command line // - ask for tag values and compare to known results // database.insert(dicomFilePath, false, false); QString instanceUID("1.2.840.113619.2.135.3596.6358736.4843.1115808177.83"); QString foundFile = database.fileForInstance(instanceUID); if (foundFile != dicomFilePath) { std::cerr << "ctkDICOMDatabase: didn't get back the original file path" << std::endl; return EXIT_FAILURE; } QString foundInstance = database.instanceForFile(dicomFilePath); if (foundInstance != instanceUID) { std::cerr << "ctkDICOMDatabase: didn't get back the original instance uid" << std::endl; return EXIT_FAILURE; } // // Test the tag cache // if (database.tagCacheExists()) { std::cerr << "ctkDICOMDatabase: tag cache should not exist in fresh database" << std::endl; return EXIT_FAILURE; } if (!database.initializeTagCache()) { std::cerr << "ctkDICOMDatabase: could not initialize tag cache" << std::endl; return EXIT_FAILURE; } if (!database.tagCacheExists()) { std::cerr << "ctkDICOMDatabase: tag cache should exist but is not detected" << std::endl; return EXIT_FAILURE; } if (database.cachedTag(instanceUID, tag) != QString("")) { std::cerr << "ctkDICOMDatabase: tag cache should return empty string for unknown instance tag" << std::endl; return EXIT_FAILURE; } QString knownSeriesDescription("3D Cor T1 FAST IR-prepped GRE"); if (!database.cacheTag(instanceUID, tag, knownSeriesDescription)) { std::cerr << "ctkDICOMDatabase: could not insert instance tag" << std::endl; return EXIT_FAILURE; } if (database.cachedTag(instanceUID, tag) != knownSeriesDescription) { std::cerr << "ctkDICOMDatabase: could not retrieve cached tag" << std::endl; return EXIT_FAILURE; } QString foundSeriesDescription = database.instanceValue(instanceUID, tag); if (foundSeriesDescription != knownSeriesDescription) { std::cerr << "ctkDICOMDatabase: invalid element value returned" << std::endl; return EXIT_FAILURE; } // now update the database database.updateSchema(); // and repeat the above checks foundFile = database.fileForInstance(instanceUID); if (foundFile != dicomFilePath) { std::cerr << "ctkDICOMDatabase: didn't get back the original file path" << std::endl; return EXIT_FAILURE; } foundSeriesDescription = database.instanceValue(instanceUID, tag); if (foundSeriesDescription != knownSeriesDescription) { std::cerr << "ctkDICOMDatabase: invalid element value returned" << std::endl; return EXIT_FAILURE; } database.closeDatabase(); database.initializeDatabase(); return EXIT_SUCCESS; }
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; }