comparison UnitTestsSources/FromDcmtkTests.cpp @ 1818:1065401501fb worklists

ParsedDicomFile::CreateFromJson
author Sebastien Jodogne <s.jodogne@gmail.com>
date Tue, 24 Nov 2015 16:48:23 +0100
parents f08978b1f45b
children 4e7c318a3f69
comparison
equal deleted inserted replaced
1817:9a6de24209cf 1818:1065401501fb
95 { 95 {
96 ASSERT_EQ(DICOM_TAG_PATIENT_NAME, FromDcmtkBridge::ParseTag("PatientName")); 96 ASSERT_EQ(DICOM_TAG_PATIENT_NAME, FromDcmtkBridge::ParseTag("PatientName"));
97 97
98 const DicomTag privateTag(0x0045, 0x0010); 98 const DicomTag privateTag(0x0045, 0x0010);
99 const DicomTag privateTag2(FromDcmtkBridge::ParseTag("0031-1020")); 99 const DicomTag privateTag2(FromDcmtkBridge::ParseTag("0031-1020"));
100 ASSERT_TRUE(FromDcmtkBridge::IsPrivateTag(privateTag)); 100 ASSERT_TRUE(privateTag.IsPrivate());
101 ASSERT_TRUE(FromDcmtkBridge::IsPrivateTag(privateTag2)); 101 ASSERT_TRUE(privateTag2.IsPrivate());
102 ASSERT_EQ(0x0031, privateTag2.GetGroup()); 102 ASSERT_EQ(0x0031, privateTag2.GetGroup());
103 ASSERT_EQ(0x1020, privateTag2.GetElement()); 103 ASSERT_EQ(0x1020, privateTag2.GetElement());
104 104
105 std::string s; 105 std::string s;
106 ParsedDicomFile o(true); 106 ParsedDicomFile o(true);
541 ASSERT_FALSE(v.isMember("7053,1000")); 541 ASSERT_FALSE(v.isMember("7053,1000"));
542 ASSERT_TRUE(v.isMember("7050,1000")); 542 ASSERT_TRUE(v.isMember("7050,1000"));
543 ASSERT_EQ(Json::stringValue, v["7050,1000"].type()); 543 ASSERT_EQ(Json::stringValue, v["7050,1000"].type());
544 ASSERT_EQ("Some public tag", v["7050,1000"].asString()); 544 ASSERT_EQ("Some public tag", v["7050,1000"].asString());
545 545
546 f.ToJson(v, DicomToJsonFormat_Short, DicomToJsonFlags_IncludePrivateTags, 0); 546 f.ToJson(v, DicomToJsonFormat_Short, static_cast<DicomToJsonFlags>(DicomToJsonFlags_IncludePrivateTags | DicomToJsonFlags_ConvertBinaryToNull), 0);
547 ASSERT_EQ(Json::objectValue, v.type()); 547 ASSERT_EQ(Json::objectValue, v.type());
548 ASSERT_EQ(7, v.getMemberNames().size()); 548 ASSERT_EQ(7, v.getMemberNames().size());
549 ASSERT_FALSE(v.isMember("7052,1000")); 549 ASSERT_FALSE(v.isMember("7052,1000"));
550 ASSERT_TRUE(v.isMember("7050,1000")); 550 ASSERT_TRUE(v.isMember("7050,1000"));
551 ASSERT_TRUE(v.isMember("7053,1000")); 551 ASSERT_TRUE(v.isMember("7053,1000"));
552 ASSERT_EQ("Some public tag", v["7050,1000"].asString()); 552 ASSERT_EQ("Some public tag", v["7050,1000"].asString());
553 ASSERT_EQ(Json::nullValue, v["7053,1000"].type()); // TODO SHOULD BE STRING 553 ASSERT_EQ(Json::nullValue, v["7053,1000"].type());
554 554
555 f.ToJson(v, DicomToJsonFormat_Short, DicomToJsonFlags_IncludeUnknownTags, 0); 555 f.ToJson(v, DicomToJsonFormat_Short, DicomToJsonFlags_IncludePrivateTags, 0);
556 ASSERT_EQ(Json::objectValue, v.type());
557 ASSERT_EQ(7, v.getMemberNames().size());
558 ASSERT_FALSE(v.isMember("7052,1000"));
559 ASSERT_TRUE(v.isMember("7050,1000"));
560 ASSERT_TRUE(v.isMember("7053,1000"));
561 ASSERT_EQ("Some public tag", v["7050,1000"].asString());
562 std::string mime, content;
563 ASSERT_EQ(Json::stringValue, v["7053,1000"].type());
564 Toolbox::DecodeDataUriScheme(mime, content, v["7053,1000"].asString());
565 ASSERT_EQ("application/octet-stream", mime);
566 ASSERT_EQ("Some private tag", content);
567
568 f.ToJson(v, DicomToJsonFormat_Short, static_cast<DicomToJsonFlags>(DicomToJsonFlags_IncludeUnknownTags | DicomToJsonFlags_ConvertBinaryToNull), 0);
556 ASSERT_EQ(Json::objectValue, v.type()); 569 ASSERT_EQ(Json::objectValue, v.type());
557 ASSERT_EQ(7, v.getMemberNames().size()); 570 ASSERT_EQ(7, v.getMemberNames().size());
558 ASSERT_TRUE(v.isMember("7050,1000")); 571 ASSERT_TRUE(v.isMember("7050,1000"));
559 ASSERT_TRUE(v.isMember("7052,1000")); 572 ASSERT_TRUE(v.isMember("7052,1000"));
560 ASSERT_FALSE(v.isMember("7053,1000")); 573 ASSERT_FALSE(v.isMember("7053,1000"));
561 ASSERT_EQ("Some public tag", v["7050,1000"].asString()); 574 ASSERT_EQ("Some public tag", v["7050,1000"].asString());
562 ASSERT_EQ(Json::nullValue, v["7052,1000"].type()); // TODO SHOULD BE STRING 575 ASSERT_EQ(Json::nullValue, v["7052,1000"].type());
563 576
564 f.ToJson(v, DicomToJsonFormat_Short, static_cast<DicomToJsonFlags>(DicomToJsonFlags_IncludeUnknownTags | DicomToJsonFlags_IncludePrivateTags), 0); 577 f.ToJson(v, DicomToJsonFormat_Short, static_cast<DicomToJsonFlags>(DicomToJsonFlags_IncludeUnknownTags), 0);
578 ASSERT_EQ(Json::objectValue, v.type());
579 ASSERT_EQ(7, v.getMemberNames().size());
580 ASSERT_TRUE(v.isMember("7050,1000"));
581 ASSERT_TRUE(v.isMember("7052,1000"));
582 ASSERT_FALSE(v.isMember("7053,1000"));
583 ASSERT_EQ("Some public tag", v["7050,1000"].asString());
584 ASSERT_EQ(Json::stringValue, v["7052,1000"].type());
585 Toolbox::DecodeDataUriScheme(mime, content, v["7052,1000"].asString());
586 ASSERT_EQ("application/octet-stream", mime);
587 ASSERT_EQ("Some unknown tag", content);
588
589 f.ToJson(v, DicomToJsonFormat_Short, static_cast<DicomToJsonFlags>(DicomToJsonFlags_IncludeUnknownTags | DicomToJsonFlags_IncludePrivateTags | DicomToJsonFlags_ConvertBinaryToNull), 0);
565 ASSERT_EQ(Json::objectValue, v.type()); 590 ASSERT_EQ(Json::objectValue, v.type());
566 ASSERT_EQ(8, v.getMemberNames().size()); 591 ASSERT_EQ(8, v.getMemberNames().size());
567 ASSERT_TRUE(v.isMember("7050,1000")); 592 ASSERT_TRUE(v.isMember("7050,1000"));
568 ASSERT_TRUE(v.isMember("7052,1000")); 593 ASSERT_TRUE(v.isMember("7052,1000"));
569 ASSERT_TRUE(v.isMember("7053,1000")); 594 ASSERT_TRUE(v.isMember("7053,1000"));
570 ASSERT_EQ("Some public tag", v["7050,1000"].asString()); 595 ASSERT_EQ("Some public tag", v["7050,1000"].asString());
571 ASSERT_EQ(Json::nullValue, v["7052,1000"].type()); // TODO SHOULD BE STRING 596 ASSERT_EQ(Json::nullValue, v["7052,1000"].type());
572 ASSERT_EQ(Json::nullValue, v["7053,1000"].type()); // TODO SHOULD BE STRING 597 ASSERT_EQ(Json::nullValue, v["7053,1000"].type());
573 } 598 }
574 599
575 600
576 TEST(ParsedDicomFile, ToJsonFlags2) 601 TEST(ParsedDicomFile, ToJsonFlags2)
577 { 602 {
635 a.ToJson(j, true); 660 a.ToJson(j, true);
636 ASSERT_EQ(3u, j.size()); 661 ASSERT_EQ(3u, j.size());
637 662
638 //std::cout << j; 663 //std::cout << j;
639 } 664 }
665
666
667 TEST(ParsedDicomFile, FromJson)
668 {
669 FromDcmtkBridge::RegisterDictionaryTag(DicomTag(0x7057, 0x1000), EVR_OB, "MyPrivateTag", 1, 1);
670 FromDcmtkBridge::RegisterDictionaryTag(DicomTag(0x7059, 0x1000), EVR_OB, "MyPrivateTag", 1, 1);
671 FromDcmtkBridge::RegisterDictionaryTag(DicomTag(0x7050, 0x1000), EVR_PN, "Declared public tag", 1, 1);
672
673 Json::Value v;
674 const std::string sopClassUid = "1.2.840.10008.5.1.4.1.1.1"; // CR Image Storage:
675
676 {
677 v["SOPClassUID"] = sopClassUid;
678 v["SpecificCharacterSet"] = "ISO_IR 148"; // This is latin-5
679 v["PatientName"] = "Sébastien";
680 v["7050-1000"] = "Some public tag"; // Even group => public tag
681 v["7052-1000"] = "Some unknown tag"; // Even group => public, unknown tag
682 v["7057-1000"] = "Some private tag"; // Odd group => private tag
683 v["7059-1000"] = "Some private tag2"; // Odd group => private tag, with an odd length to test padding
684
685 std::string s;
686 Toolbox::EncodeDataUriScheme(s, "application/octet-stream", "Sebastien");
687 v["StudyDescription"] = s;
688
689 v["PixelData"] = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg=="; // A red dot of 5x5 pixels
690 v["0040,0100"] = Json::arrayValue; // ScheduledProcedureStepSequence
691
692 Json::Value vv;
693 vv["Modality"] = "MR";
694 v["0040,0100"].append(vv);
695
696 vv["Modality"] = "CT";
697 v["0040,0100"].append(vv);
698 }
699
700 const DicomToJsonFlags toJsonFlags = static_cast<DicomToJsonFlags>(DicomToJsonFlags_IncludeBinary |
701 DicomToJsonFlags_IncludePixelData |
702 DicomToJsonFlags_IncludePrivateTags |
703 DicomToJsonFlags_IncludeUnknownTags |
704 DicomToJsonFlags_ConvertBinaryToAscii);
705
706
707 {
708 std::auto_ptr<ParsedDicomFile> dicom
709 (ParsedDicomFile::CreateFromJson(v, static_cast<DicomFromJsonFlags>(DicomFromJsonFlags_GenerateIdentifiers)));
710
711 Json::Value vv;
712 dicom->ToJson(vv, DicomToJsonFormat_Simple, toJsonFlags, 0);
713
714 ASSERT_EQ(vv["SOPClassUID"].asString(), sopClassUid);
715 ASSERT_EQ(vv["MediaStorageSOPClassUID"].asString(), sopClassUid);
716 ASSERT_TRUE(vv.isMember("SOPInstanceUID"));
717 ASSERT_TRUE(vv.isMember("SeriesInstanceUID"));
718 ASSERT_TRUE(vv.isMember("StudyInstanceUID"));
719 ASSERT_TRUE(vv.isMember("PatientID"));
720 }
721
722
723 {
724 std::auto_ptr<ParsedDicomFile> dicom
725 (ParsedDicomFile::CreateFromJson(v, static_cast<DicomFromJsonFlags>(DicomFromJsonFlags_GenerateIdentifiers)));
726
727 Json::Value vv;
728 dicom->ToJson(vv, DicomToJsonFormat_Simple, static_cast<DicomToJsonFlags>(DicomToJsonFlags_IncludePixelData), 0);
729
730 std::string mime, content;
731 Toolbox::DecodeDataUriScheme(mime, content, vv["PixelData"].asString());
732 ASSERT_EQ("application/octet-stream", mime);
733 ASSERT_EQ(5u * 5u * 3u /* the red dot is 5x5 pixels in RGB24 */ + 1 /* for padding */, content.size());
734 }
735
736
737 {
738 std::auto_ptr<ParsedDicomFile> dicom
739 (ParsedDicomFile::CreateFromJson(v, static_cast<DicomFromJsonFlags>(DicomFromJsonFlags_DecodeDataUriScheme)));
740
741 Json::Value vv;
742 dicom->ToJson(vv, DicomToJsonFormat_Short, toJsonFlags, 0);
743
744 ASSERT_FALSE(vv.isMember("SOPInstanceUID"));
745 ASSERT_FALSE(vv.isMember("SeriesInstanceUID"));
746 ASSERT_FALSE(vv.isMember("StudyInstanceUID"));
747 ASSERT_FALSE(vv.isMember("PatientID"));
748 ASSERT_EQ(2u, vv["0040,0100"].size());
749 ASSERT_EQ("MR", vv["0040,0100"][0]["0008,0060"].asString());
750 ASSERT_EQ("CT", vv["0040,0100"][1]["0008,0060"].asString());
751 ASSERT_EQ("Some public tag", vv["7050,1000"].asString());
752 ASSERT_EQ("Some unknown tag", vv["7052,1000"].asString());
753 ASSERT_EQ("Some private tag", vv["7057,1000"].asString());
754 ASSERT_EQ("Some private tag2", vv["7059,1000"].asString());
755 ASSERT_EQ("Sébastien", vv["0010,0010"].asString());
756 ASSERT_EQ("Sebastien", vv["0008,1030"].asString());
757 ASSERT_EQ("ISO_IR 148", vv["0008,0005"].asString());
758 ASSERT_EQ("5", vv[DICOM_TAG_ROWS.Format()].asString());
759 ASSERT_EQ("5", vv[DICOM_TAG_COLUMNS.Format()].asString());
760 ASSERT_TRUE(vv[DICOM_TAG_PIXEL_DATA.Format()].asString().empty());
761 }
762 }