Mercurial > hg > orthanc
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 } |