Mercurial > hg > orthanc
diff UnitTestsSources/DicomMapTests.cpp @ 3016:777762336381 db-changes
integration mainline->db-changes
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Fri, 14 Dec 2018 14:21:27 +0100 |
parents | abe49ca61cd5 |
children | 07ab06af90ed |
line wrap: on
line diff
--- a/UnitTestsSources/DicomMapTests.cpp Tue Dec 11 13:45:47 2018 +0100 +++ b/UnitTestsSources/DicomMapTests.cpp Fri Dec 14 14:21:27 2018 +0100 @@ -37,8 +37,12 @@ #include "../Core/OrthancException.h" #include "../Core/DicomFormat/DicomMap.h" #include "../Core/DicomParsing/FromDcmtkBridge.h" +#include "../Core/DicomParsing/ParsedDicomFile.h" + +#include "../OrthancServer/DicomInstanceToStore.h" #include <memory> +#include <dcmtk/dcmdata/dcdeftag.h> using namespace Orthanc; @@ -409,3 +413,140 @@ ASSERT_THROW(v->GetContent(), OrthancException); } } + + + +TEST(DicomMap, DicomAsJson) +{ + // This is a Latin-1 test string: "crane" with a circumflex accent + const unsigned char raw[] = { 0x63, 0x72, 0xe2, 0x6e, 0x65 }; + std::string latin1((char*) &raw[0], sizeof(raw) / sizeof(char)); + + std::string utf8 = Toolbox::ConvertToUtf8(latin1, Encoding_Latin1); + + ParsedDicomFile dicom(false); + dicom.SetEncoding(Encoding_Latin1); + dicom.ReplacePlainString(DICOM_TAG_PATIENT_NAME, "Hello"); + dicom.ReplacePlainString(DICOM_TAG_STUDY_DESCRIPTION, utf8); + dicom.ReplacePlainString(DICOM_TAG_SERIES_DESCRIPTION, std::string(ORTHANC_MAXIMUM_TAG_LENGTH, 'a')); + dicom.ReplacePlainString(DICOM_TAG_MANUFACTURER, std::string(ORTHANC_MAXIMUM_TAG_LENGTH + 1, 'a')); + dicom.ReplacePlainString(DICOM_TAG_PIXEL_DATA, "binary"); + dicom.ReplacePlainString(DICOM_TAG_ROWS, "512"); + + DcmDataset& dataset = *dicom.GetDcmtkObject().getDataset(); + dataset.insertEmptyElement(DCM_StudyID, OFFalse); + + { + std::auto_ptr<DcmSequenceOfItems> sequence(new DcmSequenceOfItems(DCM_ReferencedSeriesSequence)); + + { + std::auto_ptr<DcmItem> item(new DcmItem); + item->putAndInsertString(DCM_ReferencedSOPInstanceUID, "nope", OFFalse); + ASSERT_TRUE(sequence->insert(item.release(), false, false).good()); + } + + ASSERT_TRUE(dataset.insert(sequence.release(), false, false).good()); + } + + + // Check re-encoding + DcmElement* element = NULL; + ASSERT_TRUE(dataset.findAndGetElement(DCM_StudyDescription, element).good() && + element != NULL); + + char* c = NULL; + ASSERT_TRUE(element != NULL && + element->isLeaf() && + element->isaString() && + element->getString(c).good()); + ASSERT_EQ(0, memcmp(c, raw, latin1.length())); + + ASSERT_TRUE(dataset.findAndGetElement(DCM_Rows, element).good() && + element != NULL && + element->getTag().getEVR() == EVR_US); + + DicomInstanceToStore toStore; + toStore.SetParsedDicomFile(dicom); + + DicomMap m; + m.FromDicomAsJson(toStore.GetJson()); + + ASSERT_EQ("ISO_IR 100", m.GetValue(DICOM_TAG_SPECIFIC_CHARACTER_SET).GetContent()); + + ASSERT_FALSE(m.GetValue(DICOM_TAG_PATIENT_NAME).IsBinary()); + ASSERT_EQ("Hello", m.GetValue(DICOM_TAG_PATIENT_NAME).GetContent()); + + ASSERT_FALSE(m.GetValue(DICOM_TAG_STUDY_DESCRIPTION).IsBinary()); + ASSERT_EQ(utf8, m.GetValue(DICOM_TAG_STUDY_DESCRIPTION).GetContent()); + + ASSERT_FALSE(m.HasTag(DICOM_TAG_MANUFACTURER)); // Too long + ASSERT_FALSE(m.HasTag(DICOM_TAG_PIXEL_DATA)); // Pixel data + ASSERT_FALSE(m.HasTag(DICOM_TAG_REFERENCED_SERIES_SEQUENCE)); // Sequence + ASSERT_EQ(DICOM_TAG_REFERENCED_SERIES_SEQUENCE.GetGroup(), DCM_ReferencedSeriesSequence.getGroup()); + ASSERT_EQ(DICOM_TAG_REFERENCED_SERIES_SEQUENCE.GetElement(), DCM_ReferencedSeriesSequence.getElement()); + + ASSERT_TRUE(m.HasTag(DICOM_TAG_SERIES_DESCRIPTION)); // Maximum length + ASSERT_FALSE(m.GetValue(DICOM_TAG_SERIES_DESCRIPTION).IsBinary()); + ASSERT_EQ(ORTHANC_MAXIMUM_TAG_LENGTH, m.GetValue(DICOM_TAG_SERIES_DESCRIPTION).GetContent().length()); + + ASSERT_FALSE(m.GetValue(DICOM_TAG_ROWS).IsBinary()); + ASSERT_EQ("512", m.GetValue(DICOM_TAG_ROWS).GetContent()); + + ASSERT_FALSE(m.GetValue(DICOM_TAG_STUDY_ID).IsNull()); + ASSERT_FALSE(m.GetValue(DICOM_TAG_STUDY_ID).IsBinary()); + ASSERT_EQ("", m.GetValue(DICOM_TAG_STUDY_ID).GetContent()); + + DicomArray a(m); + ASSERT_EQ(6u, a.GetSize()); + + + //dicom.SaveToFile("/tmp/test.dcm"); + //std::cout << toStore.GetJson() << std::endl; + //a.Print(stdout); +} + + + +TEST(DicomMap, ExtractMainDicomTags) +{ + DicomMap b; + b.SetValue(DICOM_TAG_PATIENT_NAME, "E", false); + ASSERT_TRUE(b.HasOnlyMainDicomTags()); + + { + DicomMap a; + a.SetValue(DICOM_TAG_PATIENT_NAME, "A", false); + a.SetValue(DICOM_TAG_STUDY_DESCRIPTION, "B", false); + a.SetValue(DICOM_TAG_SERIES_DESCRIPTION, "C", false); + a.SetValue(DICOM_TAG_NUMBER_OF_FRAMES, "D", false); + a.SetValue(DICOM_TAG_SLICE_THICKNESS, "F", false); + ASSERT_FALSE(a.HasOnlyMainDicomTags()); + b.ExtractMainDicomTags(a); + } + + ASSERT_EQ(4u, b.GetSize()); + ASSERT_EQ("A", b.GetValue(DICOM_TAG_PATIENT_NAME).GetContent()); + ASSERT_EQ("B", b.GetValue(DICOM_TAG_STUDY_DESCRIPTION).GetContent()); + ASSERT_EQ("C", b.GetValue(DICOM_TAG_SERIES_DESCRIPTION).GetContent()); + ASSERT_EQ("D", b.GetValue(DICOM_TAG_NUMBER_OF_FRAMES).GetContent()); + ASSERT_FALSE(b.HasTag(DICOM_TAG_SLICE_THICKNESS)); + ASSERT_TRUE(b.HasOnlyMainDicomTags()); + + b.SetValue(DICOM_TAG_PATIENT_NAME, "G", false); + + { + DicomMap a; + a.SetValue(DICOM_TAG_PATIENT_NAME, "A", false); + a.SetValue(DICOM_TAG_SLICE_THICKNESS, "F", false); + ASSERT_FALSE(a.HasOnlyMainDicomTags()); + b.Merge(a); + } + + ASSERT_EQ(5u, b.GetSize()); + ASSERT_EQ("G", b.GetValue(DICOM_TAG_PATIENT_NAME).GetContent()); + ASSERT_EQ("B", b.GetValue(DICOM_TAG_STUDY_DESCRIPTION).GetContent()); + ASSERT_EQ("C", b.GetValue(DICOM_TAG_SERIES_DESCRIPTION).GetContent()); + ASSERT_EQ("D", b.GetValue(DICOM_TAG_NUMBER_OF_FRAMES).GetContent()); + ASSERT_EQ("F", b.GetValue(DICOM_TAG_SLICE_THICKNESS).GetContent()); + ASSERT_FALSE(b.HasOnlyMainDicomTags()); +}