comparison OrthancFramework/UnitTestsSources/FromDcmtkTests.cpp @ 4203:4d42408da117

improving const-correctness in ParsedDicomFile
author Sebastien Jodogne <s.jodogne@gmail.com>
date Thu, 17 Sep 2020 15:01:31 +0200
parents 32ac045109a6
children 50b0c69b653a
comparison
equal deleted inserted replaced
4202:2007ab69ac16 4203:4d42408da117
38 #include "../Sources/Compatibility.h" 38 #include "../Sources/Compatibility.h"
39 #include "../Sources/DicomNetworking/DicomFindAnswers.h" 39 #include "../Sources/DicomNetworking/DicomFindAnswers.h"
40 #include "../Sources/DicomParsing/DicomModification.h" 40 #include "../Sources/DicomParsing/DicomModification.h"
41 #include "../Sources/DicomParsing/DicomWebJsonVisitor.h" 41 #include "../Sources/DicomParsing/DicomWebJsonVisitor.h"
42 #include "../Sources/DicomParsing/FromDcmtkBridge.h" 42 #include "../Sources/DicomParsing/FromDcmtkBridge.h"
43 #include "../Sources/DicomParsing/Internals/DicomImageDecoder.h"
44 #include "../Sources/DicomParsing/ToDcmtkBridge.h" 43 #include "../Sources/DicomParsing/ToDcmtkBridge.h"
45 #include "../Sources/Endianness.h" 44 #include "../Sources/Endianness.h"
46 #include "../Sources/Images/Image.h" 45 #include "../Sources/Images/Image.h"
47 #include "../Sources/Images/ImageBuffer.h" 46 #include "../Sources/Images/ImageBuffer.h"
48 #include "../Sources/Images/ImageProcessing.h" 47 #include "../Sources/Images/ImageProcessing.h"
779 { 778 {
780 std::string s; 779 std::string s;
781 Orthanc::SystemToolbox::ReadFile(s, PATH); 780 Orthanc::SystemToolbox::ReadFile(s, PATH);
782 Orthanc::ParsedDicomFile f(s); 781 Orthanc::ParsedDicomFile f(s);
783 782
784 std::unique_ptr<Orthanc::ImageAccessor> decoded(Orthanc::DicomImageDecoder::Decode(f, 0)); 783 std::unique_ptr<Orthanc::ImageAccessor> decoded(f.DecodeFrame(0));
785 ASSERT_EQ(256u, decoded->GetWidth()); 784 ASSERT_EQ(256u, decoded->GetWidth());
786 ASSERT_EQ(256u, decoded->GetHeight()); 785 ASSERT_EQ(256u, decoded->GetHeight());
787 ASSERT_EQ(Orthanc::PixelFormat_Grayscale8, decoded->GetFormat()); 786 ASSERT_EQ(Orthanc::PixelFormat_Grayscale8, decoded->GetFormat());
788 787
789 for (int y = 0; y < 256; y++) 788 for (int y = 0; y < 256; y++)
841 { 840 {
842 std::string s; 841 std::string s;
843 Orthanc::SystemToolbox::ReadFile(s, PATH); 842 Orthanc::SystemToolbox::ReadFile(s, PATH);
844 Orthanc::ParsedDicomFile f(s); 843 Orthanc::ParsedDicomFile f(s);
845 844
846 std::unique_ptr<Orthanc::ImageAccessor> decoded(Orthanc::DicomImageDecoder::Decode(f, 0)); 845 std::unique_ptr<Orthanc::ImageAccessor> decoded(f.DecodeFrame(0));
847 ASSERT_EQ(384u, decoded->GetWidth()); 846 ASSERT_EQ(384u, decoded->GetWidth());
848 ASSERT_EQ(256u, decoded->GetHeight()); 847 ASSERT_EQ(256u, decoded->GetHeight());
849 ASSERT_EQ(Orthanc::PixelFormat_RGB24, decoded->GetFormat()); 848 ASSERT_EQ(Orthanc::PixelFormat_RGB24, decoded->GetFormat());
850 849
851 for (int y = 0; y < 256; y++) 850 for (int y = 0; y < 256; y++)
898 { 897 {
899 std::string s; 898 std::string s;
900 Orthanc::SystemToolbox::ReadFile(s, PATH); 899 Orthanc::SystemToolbox::ReadFile(s, PATH);
901 Orthanc::ParsedDicomFile f(s); 900 Orthanc::ParsedDicomFile f(s);
902 901
903 std::unique_ptr<Orthanc::ImageAccessor> decoded(Orthanc::DicomImageDecoder::Decode(f, 0)); 902 std::unique_ptr<Orthanc::ImageAccessor> decoded(f.DecodeFrame(0));
904 ASSERT_EQ(256u, decoded->GetWidth()); 903 ASSERT_EQ(256u, decoded->GetWidth());
905 ASSERT_EQ(256u, decoded->GetHeight()); 904 ASSERT_EQ(256u, decoded->GetHeight());
906 ASSERT_EQ(Orthanc::PixelFormat_Grayscale16, decoded->GetFormat()); 905 ASSERT_EQ(Orthanc::PixelFormat_Grayscale16, decoded->GetFormat());
907 906
908 for (int y = 0; y < 256; y++) 907 for (int y = 0; y < 256; y++)
954 { 953 {
955 std::string s; 954 std::string s;
956 Orthanc::SystemToolbox::ReadFile(s, PATH); 955 Orthanc::SystemToolbox::ReadFile(s, PATH);
957 Orthanc::ParsedDicomFile f(s); 956 Orthanc::ParsedDicomFile f(s);
958 957
959 std::unique_ptr<Orthanc::ImageAccessor> decoded(Orthanc::DicomImageDecoder::Decode(f, 0)); 958 std::unique_ptr<Orthanc::ImageAccessor> decoded(f.DecodeFrame(0));
960 ASSERT_EQ(256u, decoded->GetWidth()); 959 ASSERT_EQ(256u, decoded->GetWidth());
961 ASSERT_EQ(256u, decoded->GetHeight()); 960 ASSERT_EQ(256u, decoded->GetHeight());
962 ASSERT_EQ(Orthanc::PixelFormat_SignedGrayscale16, decoded->GetFormat()); 961 ASSERT_EQ(Orthanc::PixelFormat_SignedGrayscale16, decoded->GetFormat());
963 962
964 for (int y = 0; y < 256; y++) 963 for (int y = 0; y < 256; y++)
970 } 969 }
971 } 970 }
972 971
973 972
974 973
975 static void CheckEncoding(const ParsedDicomFile& dicom, 974 static void CheckEncoding(ParsedDicomFile& dicom,
976 Encoding expected) 975 Encoding expected)
977 { 976 {
978 const char* value = NULL; 977 const char* value = NULL;
979 ASSERT_TRUE(dicom.GetDcmtkObject().getDataset()->findAndGetString(DCM_SpecificCharacterSet, value).good()); 978 ASSERT_TRUE(dicom.GetDcmtkObject().getDataset()->findAndGetString(DCM_SpecificCharacterSet, value).good());
980 979
1050 if (testEncodings[i] != Encoding_Chinese) 1049 if (testEncodings[i] != Encoding_Chinese)
1051 { 1050 {
1052 // A specific source string is used in "EncodingTests.py" to 1051 // A specific source string is used in "EncodingTests.py" to
1053 // test against Chinese, it is normal that it does not correspond to UTF8 1052 // test against Chinese, it is normal that it does not correspond to UTF8
1054 1053
1055 std::string encoded = Toolbox::ConvertToUtf8(Toolbox::ConvertFromUtf8(utf8, testEncodings[i]), testEncodings[i], false); 1054 const std::string tmp = Toolbox::ConvertToUtf8(
1056 ASSERT_STREQ(testEncodingsExpected[i], encoded.c_str()); 1055 Toolbox::ConvertFromUtf8(utf8, testEncodings[i]), testEncodings[i], false);
1056 ASSERT_STREQ(testEncodingsExpected[i], tmp.c_str());
1057 } 1057 }
1058 } 1058 }
1059 1059
1060 1060
1061 Json::Value v; 1061 Json::Value v;
1967 1967
1968 { 1968 {
1969 DicomMap m; 1969 DicomMap m;
1970 m.FromDicomWeb(visitor.GetResult()); 1970 m.FromDicomWeb(visitor.GetResult());
1971 ASSERT_EQ(31u, m.GetSize()); 1971 ASSERT_EQ(31u, m.GetSize());
1972 1972
1973 std::string s;
1974 ASSERT_TRUE(m.LookupStringValue(s, DicomTag(0x0002, 0x0002), false)); ASSERT_EQ("UI", s); 1973 ASSERT_TRUE(m.LookupStringValue(s, DicomTag(0x0002, 0x0002), false)); ASSERT_EQ("UI", s);
1975 ASSERT_TRUE(m.LookupStringValue(s, DicomTag(0x0040, 0x0241), false)); ASSERT_EQ("AE", s); 1974 ASSERT_TRUE(m.LookupStringValue(s, DicomTag(0x0040, 0x0241), false)); ASSERT_EQ("AE", s);
1976 ASSERT_TRUE(m.LookupStringValue(s, DicomTag(0x0010, 0x1010), false)); ASSERT_EQ("AS", s); 1975 ASSERT_TRUE(m.LookupStringValue(s, DicomTag(0x0010, 0x1010), false)); ASSERT_EQ("AS", s);
1977 ASSERT_TRUE(m.LookupStringValue(s, DicomTag(0x0020, 0x9165), false)); ASSERT_EQ("00100020", s); 1976 ASSERT_TRUE(m.LookupStringValue(s, DicomTag(0x0020, 0x9165), false)); ASSERT_EQ("00100020", s);
1978 ASSERT_TRUE(m.LookupStringValue(s, DicomTag(0x0008, 0x0052), false)); ASSERT_EQ("CS", s); 1977 ASSERT_TRUE(m.LookupStringValue(s, DicomTag(0x0008, 0x0052), false)); ASSERT_EQ("CS", s);
2017 #else 2016 #else
2018 ASSERT_TRUE(m.LookupStringValue(s, DicomTag(0x0066, 0x0040), true)); ASSERT_EQ("46", s); // OL 2017 ASSERT_TRUE(m.LookupStringValue(s, DicomTag(0x0066, 0x0040), true)); ASSERT_EQ("46", s); // OL
2019 ASSERT_TRUE(m.LookupStringValue(s, DicomTag(0x0008, 0x0119), true)); ASSERT_EQ("UC", s); 2018 ASSERT_TRUE(m.LookupStringValue(s, DicomTag(0x0008, 0x0119), true)); ASSERT_EQ("UC", s);
2020 ASSERT_TRUE(m.LookupStringValue(s, DicomTag(0x0008, 0x0120), true)); ASSERT_EQ("UR", s); 2019 ASSERT_TRUE(m.LookupStringValue(s, DicomTag(0x0008, 0x0120), true)); ASSERT_EQ("UR", s);
2021 ASSERT_TRUE(m.LookupStringValue(s, DicomTag(0x0008, 0x0301), true)); ASSERT_EQ("17", s); // US (but tag unknown to DCMTK 3.6.0) 2020 ASSERT_TRUE(m.LookupStringValue(s, DicomTag(0x0008, 0x0301), true)); ASSERT_EQ("17", s); // US (but tag unknown to DCMTK 3.6.0)
2022 #endif 2021 #endif
2023
2024 } 2022 }
2025 } 2023 }
2026 2024
2027 2025
2028 TEST(DicomWebJson, Sequence) 2026 TEST(DicomWebJson, Sequence)
2105 printf("\n======= %s\n", GetTransferSyntaxUid(a)); 2103 printf("\n======= %s\n", GetTransferSyntaxUid(a));
2106 2104
2107 std::string source; 2105 std::string source;
2108 Orthanc::SystemToolbox::ReadFile(source, path); 2106 Orthanc::SystemToolbox::ReadFile(source, path);
2109 2107
2110 std::string c, i; 2108 std::string c, k;
2111 try 2109 try
2112 { 2110 {
2113 scu.Transcode(c, i, transcoder, source.c_str(), source.size(), false, "", 0); 2111 scu.Transcode(c, k, transcoder, source.c_str(), source.size(), false, "", 0);
2114 } 2112 }
2115 catch (OrthancException& e) 2113 catch (OrthancException& e)
2116 { 2114 {
2117 if (e.GetErrorCode() == ErrorCode_NotImplemented) 2115 if (e.GetErrorCode() == ErrorCode_NotImplemented)
2118 { 2116 {
2119 LOG(ERROR) << "cannot transcode " << GetTransferSyntaxUid(a); 2117 LOG(ERROR) << "cannot transcode " << GetTransferSyntaxUid(a);
2120 } 2118 }
2121 else 2119 else
2122 { 2120 {
2123 throw e; 2121 throw;
2124 } 2122 }
2125 } 2123 }
2126 } 2124 }
2127 } 2125 }
2128 } 2126 }
2129 2127
2130 2128
2131 TEST(Toto, DISABLED_Transcode4) 2129 TEST(Toto, DISABLED_Transcode4)
2132 { 2130 {
2133 std::string source; 2131 std::unique_ptr<DcmFileFormat> toto;
2134 Orthanc::SystemToolbox::ReadFile(source, "/home/jodogne/Subversion/orthanc-tests/Database/KarstenHilbertRF.dcm"); 2132
2135 2133 {
2136 std::unique_ptr<DcmFileFormat> toto(FromDcmtkBridge::LoadFromMemoryBuffer(source.c_str(), source.size())); 2134 std::string source;
2135 Orthanc::SystemToolbox::ReadFile(source, "/home/jodogne/Subversion/orthanc-tests/Database/KarstenHilbertRF.dcm");
2136 toto.reset(FromDcmtkBridge::LoadFromMemoryBuffer(source.c_str(), source.size()));
2137 }
2138
2137 const std::string sourceUid = IDicomTranscoder::GetSopInstanceUid(*toto); 2139 const std::string sourceUid = IDicomTranscoder::GetSopInstanceUid(*toto);
2138 2140
2139 DicomTransferSyntax sourceSyntax; 2141 DicomTransferSyntax sourceSyntax;
2140 ASSERT_TRUE(FromDcmtkBridge::LookupOrthancTransferSyntax(sourceSyntax, *toto)); 2142 ASSERT_TRUE(FromDcmtkBridge::LookupOrthancTransferSyntax(sourceSyntax, *toto));
2141 2143