comparison UnitTestsSources/DicomMapTests.cpp @ 3005:8265a6b56100

DicomMap::FromDicomAsJson
author Sebastien Jodogne <s.jodogne@gmail.com>
date Wed, 12 Dec 2018 15:42:33 +0100
parents da12ba232119
children 0e1755e5efd0
comparison
equal deleted inserted replaced
3004:80d1a3452807 3005:8265a6b56100
35 #include "gtest/gtest.h" 35 #include "gtest/gtest.h"
36 36
37 #include "../Core/OrthancException.h" 37 #include "../Core/OrthancException.h"
38 #include "../Core/DicomFormat/DicomMap.h" 38 #include "../Core/DicomFormat/DicomMap.h"
39 #include "../Core/DicomParsing/FromDcmtkBridge.h" 39 #include "../Core/DicomParsing/FromDcmtkBridge.h"
40 #include "../Core/DicomParsing/ParsedDicomFile.h"
41
42 #include "../OrthancServer/DicomInstanceToStore.h"
40 43
41 #include <memory> 44 #include <memory>
45 #include <dcmtk/dcmdata/dcdeftag.h>
42 46
43 using namespace Orthanc; 47 using namespace Orthanc;
44 48
45 TEST(DicomMap, MainTags) 49 TEST(DicomMap, MainTags)
46 { 50 {
407 ASSERT_TRUE(v->IsNull()); 411 ASSERT_TRUE(v->IsNull());
408 ASSERT_FALSE(v->IsBinary()); 412 ASSERT_FALSE(v->IsBinary());
409 ASSERT_THROW(v->GetContent(), OrthancException); 413 ASSERT_THROW(v->GetContent(), OrthancException);
410 } 414 }
411 } 415 }
416
417
418
419 TEST(DicomMap, DicomAsJson)
420 {
421 // This is a Latin-1 test string: "crane" with a circumflex accent
422 const unsigned char raw[] = { 0x63, 0x72, 0xe2, 0x6e, 0x65 };
423 std::string latin1((char*) &raw[0], sizeof(raw) / sizeof(char));
424
425 std::string utf8 = Toolbox::ConvertToUtf8(latin1, Encoding_Latin1);
426
427 ParsedDicomFile dicom(false);
428 dicom.SetEncoding(Encoding_Latin1);
429 dicom.ReplacePlainString(DICOM_TAG_PATIENT_NAME, "Hello");
430 dicom.ReplacePlainString(DICOM_TAG_STUDY_DESCRIPTION, utf8);
431 dicom.ReplacePlainString(DICOM_TAG_SERIES_DESCRIPTION, std::string(ORTHANC_MAXIMUM_TAG_LENGTH, 'a'));
432 dicom.ReplacePlainString(DICOM_TAG_MANUFACTURER, std::string(ORTHANC_MAXIMUM_TAG_LENGTH + 1, 'a'));
433 dicom.ReplacePlainString(DICOM_TAG_PIXEL_DATA, "binary");
434 dicom.ReplacePlainString(DICOM_TAG_ROWS, "512");
435
436 DcmDataset& dataset = *dicom.GetDcmtkObject().getDataset();
437 dataset.insertEmptyElement(DCM_StudyID, OFFalse);
438
439 {
440 std::auto_ptr<DcmSequenceOfItems> sequence(new DcmSequenceOfItems(DCM_ReferencedSeriesSequence));
441
442 {
443 std::auto_ptr<DcmItem> item(new DcmItem);
444 item->putAndInsertString(DCM_ReferencedSOPInstanceUID, "nope", OFFalse);
445 ASSERT_TRUE(sequence->insert(item.release(), false, false).good());
446 }
447
448 ASSERT_TRUE(dataset.insert(sequence.release(), false, false).good());
449 }
450
451
452 // Check re-encoding
453 DcmElement* element = NULL;
454 ASSERT_TRUE(dataset.findAndGetElement(DCM_StudyDescription, element).good() &&
455 element != NULL);
456
457 char* c = NULL;
458 ASSERT_TRUE(element != NULL &&
459 element->isLeaf() &&
460 element->isaString() &&
461 element->getString(c).good());
462 ASSERT_EQ(0, memcmp(c, raw, latin1.length()));
463
464 ASSERT_TRUE(dataset.findAndGetElement(DCM_Rows, element).good() &&
465 element != NULL &&
466 element->getTag().getEVR() == EVR_US);
467
468 DicomInstanceToStore toStore;
469 toStore.SetParsedDicomFile(dicom);
470
471 DicomMap m;
472 m.FromDicomAsJson(toStore.GetJson());
473
474 ASSERT_EQ("ISO_IR 100", m.GetValue(DICOM_TAG_SPECIFIC_CHARACTER_SET).GetContent());
475
476 ASSERT_FALSE(m.GetValue(DICOM_TAG_PATIENT_NAME).IsBinary());
477 ASSERT_EQ("Hello", m.GetValue(DICOM_TAG_PATIENT_NAME).GetContent());
478
479 ASSERT_FALSE(m.GetValue(DICOM_TAG_STUDY_DESCRIPTION).IsBinary());
480 ASSERT_EQ(utf8, m.GetValue(DICOM_TAG_STUDY_DESCRIPTION).GetContent());
481
482 ASSERT_FALSE(m.HasTag(DICOM_TAG_MANUFACTURER)); // Too long
483 ASSERT_FALSE(m.HasTag(DICOM_TAG_PIXEL_DATA)); // Pixel data
484 ASSERT_FALSE(m.HasTag(DICOM_TAG_REFERENCED_SERIES_SEQUENCE)); // Sequence
485 ASSERT_EQ(DICOM_TAG_REFERENCED_SERIES_SEQUENCE.GetGroup(), DCM_ReferencedSeriesSequence.getGroup());
486 ASSERT_EQ(DICOM_TAG_REFERENCED_SERIES_SEQUENCE.GetElement(), DCM_ReferencedSeriesSequence.getElement());
487
488 ASSERT_TRUE(m.HasTag(DICOM_TAG_SERIES_DESCRIPTION)); // Maximum length
489 ASSERT_FALSE(m.GetValue(DICOM_TAG_SERIES_DESCRIPTION).IsBinary());
490 ASSERT_EQ(ORTHANC_MAXIMUM_TAG_LENGTH, m.GetValue(DICOM_TAG_SERIES_DESCRIPTION).GetContent().length());
491
492 ASSERT_FALSE(m.GetValue(DICOM_TAG_ROWS).IsBinary());
493 ASSERT_EQ("512", m.GetValue(DICOM_TAG_ROWS).GetContent());
494
495 ASSERT_FALSE(m.GetValue(DICOM_TAG_STUDY_ID).IsNull());
496 ASSERT_FALSE(m.GetValue(DICOM_TAG_STUDY_ID).IsBinary());
497 ASSERT_EQ("", m.GetValue(DICOM_TAG_STUDY_ID).GetContent());
498
499 DicomArray a(m);
500 ASSERT_EQ(6u, a.GetSize());
501
502
503 //dicom.SaveToFile("/tmp/test.dcm");
504 //std::cout << toStore.GetJson() << std::endl;
505 //a.Print(stdout);
506 }