comparison OrthancServer/UnitTestsSources/UnitTestsMain.cpp @ 4057:8b7cd69806f2 framework

move DicomMapTests from OrthancServer to OrthancFramework
author Sebastien Jodogne <s.jodogne@gmail.com>
date Thu, 11 Jun 2020 13:55:25 +0200
parents 9214e3a7b0a2
children e241e5f3f088
comparison
equal deleted inserted replaced
4056:55727d85f419 4057:8b7cd69806f2
39 #include "../../OrthancFramework/Sources/Logging.h" 39 #include "../../OrthancFramework/Sources/Logging.h"
40 #include "../../OrthancFramework/Sources/Toolbox.h" 40 #include "../../OrthancFramework/Sources/Toolbox.h"
41 #include "../../OrthancFramework/Sources/OrthancException.h" 41 #include "../../OrthancFramework/Sources/OrthancException.h"
42 #include "../../OrthancFramework/Sources/Images/Image.h" 42 #include "../../OrthancFramework/Sources/Images/Image.h"
43 #include "../../OrthancFramework/Sources/Images/PngWriter.h" 43 #include "../../OrthancFramework/Sources/Images/PngWriter.h"
44 #include "../../OrthancFramework/Sources/DicomParsing/ParsedDicomFile.h"
44 #include "../../OrthancFramework/Sources/DicomParsing/FromDcmtkBridge.h" 45 #include "../../OrthancFramework/Sources/DicomParsing/FromDcmtkBridge.h"
45 #include "../../OrthancFramework/Sources/DicomParsing/ToDcmtkBridge.h" 46 #include "../../OrthancFramework/Sources/DicomParsing/ToDcmtkBridge.h"
46 47
48 #include "../Plugins/Engine/PluginsEnumerations.h"
49 #include "../Sources/DicomInstanceToStore.h"
47 #include "../Sources/OrthancConfiguration.h" // For the FontRegistry 50 #include "../Sources/OrthancConfiguration.h" // For the FontRegistry
48 #include "../Sources/OrthancInitialization.h" 51 #include "../Sources/OrthancInitialization.h"
49 #include "../Sources/ServerEnumerations.h" 52 #include "../Sources/ServerEnumerations.h"
50 #include "../Sources/ServerToolbox.h" 53 #include "../Sources/ServerToolbox.h"
51 #include "../Plugins/Engine/PluginsEnumerations.h" 54
55 #include <dcmtk/dcmdata/dcdeftag.h>
52 56
53 57
54 using namespace Orthanc; 58 using namespace Orthanc;
55 59
56 60
185 #endif 189 #endif
186 } 190 }
187 191
188 192
189 193
194 TEST(DicomMap, DicomAsJson)
195 {
196 // This is a Latin-1 test string: "crane" with a circumflex accent
197 const unsigned char raw[] = { 0x63, 0x72, 0xe2, 0x6e, 0x65 };
198 std::string latin1((char*) &raw[0], sizeof(raw) / sizeof(char));
199
200 std::string utf8 = Toolbox::ConvertToUtf8(latin1, Encoding_Latin1, false);
201
202 ParsedDicomFile dicom(false);
203 dicom.SetEncoding(Encoding_Latin1);
204 dicom.ReplacePlainString(DICOM_TAG_PATIENT_NAME, "Hello");
205 dicom.ReplacePlainString(DICOM_TAG_STUDY_DESCRIPTION, utf8);
206 dicom.ReplacePlainString(DICOM_TAG_SERIES_DESCRIPTION, std::string(ORTHANC_MAXIMUM_TAG_LENGTH, 'a'));
207 dicom.ReplacePlainString(DICOM_TAG_MANUFACTURER, std::string(ORTHANC_MAXIMUM_TAG_LENGTH + 1, 'a'));
208 dicom.ReplacePlainString(DICOM_TAG_PIXEL_DATA, "binary");
209 dicom.ReplacePlainString(DICOM_TAG_ROWS, "512");
210
211 DcmDataset& dataset = *dicom.GetDcmtkObject().getDataset();
212 dataset.insertEmptyElement(DCM_StudyID, OFFalse);
213
214 {
215 std::unique_ptr<DcmSequenceOfItems> sequence(new DcmSequenceOfItems(DCM_ReferencedSeriesSequence));
216
217 {
218 std::unique_ptr<DcmItem> item(new DcmItem);
219 item->putAndInsertString(DCM_ReferencedSOPInstanceUID, "nope", OFFalse);
220 ASSERT_TRUE(sequence->insert(item.release(), false, false).good());
221 }
222
223 ASSERT_TRUE(dataset.insert(sequence.release(), false, false).good());
224 }
225
226
227 // Check re-encoding
228 DcmElement* element = NULL;
229 ASSERT_TRUE(dataset.findAndGetElement(DCM_StudyDescription, element).good() &&
230 element != NULL);
231
232 char* c = NULL;
233 ASSERT_TRUE(element != NULL &&
234 element->isLeaf() &&
235 element->isaString() &&
236 element->getString(c).good());
237 ASSERT_EQ(0, memcmp(c, raw, latin1.length()));
238
239 ASSERT_TRUE(dataset.findAndGetElement(DCM_Rows, element).good() &&
240 element != NULL &&
241 element->getTag().getEVR() == EVR_US);
242
243 DicomInstanceToStore toStore;
244 toStore.SetParsedDicomFile(dicom);
245
246 DicomMap m;
247 m.FromDicomAsJson(toStore.GetJson());
248
249 ASSERT_EQ("ISO_IR 100", m.GetValue(DICOM_TAG_SPECIFIC_CHARACTER_SET).GetContent());
250
251 ASSERT_FALSE(m.GetValue(DICOM_TAG_PATIENT_NAME).IsBinary());
252 ASSERT_EQ("Hello", m.GetValue(DICOM_TAG_PATIENT_NAME).GetContent());
253
254 ASSERT_FALSE(m.GetValue(DICOM_TAG_STUDY_DESCRIPTION).IsBinary());
255 ASSERT_EQ(utf8, m.GetValue(DICOM_TAG_STUDY_DESCRIPTION).GetContent());
256
257 ASSERT_FALSE(m.HasTag(DICOM_TAG_MANUFACTURER)); // Too long
258 ASSERT_FALSE(m.HasTag(DICOM_TAG_PIXEL_DATA)); // Pixel data
259 ASSERT_FALSE(m.HasTag(DICOM_TAG_REFERENCED_SERIES_SEQUENCE)); // Sequence
260 ASSERT_EQ(DICOM_TAG_REFERENCED_SERIES_SEQUENCE.GetGroup(), DCM_ReferencedSeriesSequence.getGroup());
261 ASSERT_EQ(DICOM_TAG_REFERENCED_SERIES_SEQUENCE.GetElement(), DCM_ReferencedSeriesSequence.getElement());
262
263 ASSERT_TRUE(m.HasTag(DICOM_TAG_SERIES_DESCRIPTION)); // Maximum length
264 ASSERT_FALSE(m.GetValue(DICOM_TAG_SERIES_DESCRIPTION).IsBinary());
265 ASSERT_EQ(ORTHANC_MAXIMUM_TAG_LENGTH,
266 static_cast<int>(m.GetValue(DICOM_TAG_SERIES_DESCRIPTION).GetContent().length()));
267
268 ASSERT_FALSE(m.GetValue(DICOM_TAG_ROWS).IsBinary());
269 ASSERT_EQ("512", m.GetValue(DICOM_TAG_ROWS).GetContent());
270
271 ASSERT_FALSE(m.GetValue(DICOM_TAG_STUDY_ID).IsNull());
272 ASSERT_FALSE(m.GetValue(DICOM_TAG_STUDY_ID).IsBinary());
273 ASSERT_EQ("", m.GetValue(DICOM_TAG_STUDY_ID).GetContent());
274
275 DicomArray a(m);
276 ASSERT_EQ(6u, a.GetSize());
277
278
279 //dicom.SaveToFile("/tmp/test.dcm");
280 //std::cout << toStore.GetJson() << std::endl;
281 //a.Print(stdout);
282 }
283
284
285
190 namespace Orthanc 286 namespace Orthanc
191 { 287 {
192 // Namespace for the "FRIEND_TEST()" directive in "FromDcmtkBridge" to apply: 288 // Namespace for the "FRIEND_TEST()" directive in "FromDcmtkBridge" to apply:
193 // https://github.com/google/googletest/blob/master/googletest/docs/AdvancedGuide.md#private-class-members 289 // https://github.com/google/googletest/blob/master/googletest/docs/AdvancedGuide.md#private-class-members
194 290