Mercurial > hg > orthanc
comparison UnitTestsSources/FromDcmtkTests.cpp @ 1701:4aaaecae5803 db-changes
integration mainline->db-changes
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Mon, 12 Oct 2015 14:47:58 +0200 |
parents | 8ca0e89798b2 |
children | a001f6226c7c |
comparison
equal
deleted
inserted
replaced
1683:21d31da73374 | 1701:4aaaecae5803 |
---|---|
34 #include "gtest/gtest.h" | 34 #include "gtest/gtest.h" |
35 | 35 |
36 #include "../OrthancServer/FromDcmtkBridge.h" | 36 #include "../OrthancServer/FromDcmtkBridge.h" |
37 #include "../OrthancServer/OrthancInitialization.h" | 37 #include "../OrthancServer/OrthancInitialization.h" |
38 #include "../OrthancServer/DicomModification.h" | 38 #include "../OrthancServer/DicomModification.h" |
39 #include "../OrthancServer/ServerToolbox.h" | |
39 #include "../Core/OrthancException.h" | 40 #include "../Core/OrthancException.h" |
40 #include "../Core/Images/ImageBuffer.h" | 41 #include "../Core/Images/ImageBuffer.h" |
41 #include "../Core/Images/PngReader.h" | 42 #include "../Core/Images/PngReader.h" |
42 #include "../Core/Images/PngWriter.h" | 43 #include "../Core/Images/PngWriter.h" |
43 #include "../Core/Uuid.h" | 44 #include "../Core/Uuid.h" |
44 #include "../Resources/EncodingTests.h" | 45 #include "../Resources/EncodingTests.h" |
46 | |
47 #include <dcmtk/dcmdata/dcelem.h> | |
45 | 48 |
46 using namespace Orthanc; | 49 using namespace Orthanc; |
47 | 50 |
48 TEST(DicomFormat, Tag) | 51 TEST(DicomFormat, Tag) |
49 { | 52 { |
100 | 103 |
101 std::string s; | 104 std::string s; |
102 ParsedDicomFile o; | 105 ParsedDicomFile o; |
103 o.Replace(DICOM_TAG_PATIENT_NAME, "coucou"); | 106 o.Replace(DICOM_TAG_PATIENT_NAME, "coucou"); |
104 ASSERT_FALSE(o.GetTagValue(s, privateTag)); | 107 ASSERT_FALSE(o.GetTagValue(s, privateTag)); |
105 o.Insert(privateTag, "private tag"); | 108 o.Insert(privateTag, "private tag", false); |
106 ASSERT_TRUE(o.GetTagValue(s, privateTag)); | 109 ASSERT_TRUE(o.GetTagValue(s, privateTag)); |
107 ASSERT_STREQ("private tag", s.c_str()); | 110 ASSERT_STREQ("private tag", s.c_str()); |
108 | 111 |
109 ASSERT_FALSE(o.GetTagValue(s, privateTag2)); | 112 ASSERT_FALSE(o.GetTagValue(s, privateTag2)); |
110 ASSERT_THROW(o.Replace(privateTag2, "hello", DicomReplaceMode_ThrowIfAbsent), OrthancException); | 113 ASSERT_THROW(o.Replace(privateTag2, "hello", DicomReplaceMode_ThrowIfAbsent), OrthancException); |
202 for (unsigned int i = 0; i < testEncodingsCount; i++) | 205 for (unsigned int i = 0; i < testEncodingsCount; i++) |
203 { | 206 { |
204 std::string source(testEncodingsEncoded[i]); | 207 std::string source(testEncodingsEncoded[i]); |
205 std::string expected(testEncodingsExpected[i]); | 208 std::string expected(testEncodingsExpected[i]); |
206 std::string s = Toolbox::ConvertToUtf8(source, testEncodings[i]); | 209 std::string s = Toolbox::ConvertToUtf8(source, testEncodings[i]); |
207 std::cout << EnumerationToString(testEncodings[i]) << std::endl; | 210 //std::cout << EnumerationToString(testEncodings[i]) << std::endl; |
208 EXPECT_EQ(expected, s); | 211 EXPECT_EQ(expected, s); |
209 } | 212 } |
210 } | 213 } |
211 | 214 |
212 | 215 |
257 | 260 |
258 TEST(FromDcmtkBridge, Encodings3) | 261 TEST(FromDcmtkBridge, Encodings3) |
259 { | 262 { |
260 for (unsigned int i = 0; i < testEncodingsCount; i++) | 263 for (unsigned int i = 0; i < testEncodingsCount; i++) |
261 { | 264 { |
262 std::cout << EnumerationToString(testEncodings[i]) << std::endl; | 265 //std::cout << EnumerationToString(testEncodings[i]) << std::endl; |
263 std::string dicom; | 266 std::string dicom; |
264 | 267 |
265 { | 268 { |
266 ParsedDicomFile f; | 269 ParsedDicomFile f; |
267 f.SetEncoding(testEncodings[i]); | 270 f.SetEncoding(testEncodings[i]); |
268 f.Insert(DICOM_TAG_PATIENT_NAME, testEncodingsEncoded[i]); | 271 |
272 std::string s = Toolbox::ConvertToUtf8(testEncodingsEncoded[i], testEncodings[i]); | |
273 f.Insert(DICOM_TAG_PATIENT_NAME, s, false); | |
269 f.SaveToMemoryBuffer(dicom); | 274 f.SaveToMemoryBuffer(dicom); |
270 } | 275 } |
271 | 276 |
272 if (testEncodings[i] != Encoding_Windows1251) | 277 if (testEncodings[i] != Encoding_Windows1251) |
273 { | 278 { |
297 ASSERT_EQ(ValueRepresentation_DateTime, | 302 ASSERT_EQ(ValueRepresentation_DateTime, |
298 FromDcmtkBridge::GetValueRepresentation(DicomTag(0x0008, 0x002a) /* AcquisitionDateTime */)); | 303 FromDcmtkBridge::GetValueRepresentation(DicomTag(0x0008, 0x002a) /* AcquisitionDateTime */)); |
299 ASSERT_EQ(ValueRepresentation_Other, | 304 ASSERT_EQ(ValueRepresentation_Other, |
300 FromDcmtkBridge::GetValueRepresentation(DICOM_TAG_PATIENT_ID)); | 305 FromDcmtkBridge::GetValueRepresentation(DICOM_TAG_PATIENT_ID)); |
301 } | 306 } |
307 | |
308 | |
309 | |
310 static const DicomTag REFERENCED_STUDY_SEQUENCE(0x0008, 0x1110); | |
311 static const DicomTag REFERENCED_PATIENT_SEQUENCE(0x0008, 0x1120); | |
312 | |
313 static void CreateSampleJson(Json::Value& a) | |
314 { | |
315 { | |
316 Json::Value b = Json::objectValue; | |
317 b["PatientName"] = "Hello"; | |
318 b["PatientID"] = "World"; | |
319 b["StudyDescription"] = "Toto"; | |
320 a.append(b); | |
321 } | |
322 | |
323 { | |
324 Json::Value b = Json::objectValue; | |
325 b["PatientName"] = "data:application/octet-stream;base64,SGVsbG8y"; // echo -n "Hello2" | base64 | |
326 b["PatientID"] = "World2"; | |
327 a.append(b); | |
328 } | |
329 } | |
330 | |
331 | |
332 TEST(FromDcmtkBridge, FromJson) | |
333 { | |
334 std::auto_ptr<DcmElement> element; | |
335 | |
336 { | |
337 Json::Value a; | |
338 a = "Hello"; | |
339 element.reset(FromDcmtkBridge::FromJson(DICOM_TAG_PATIENT_NAME, a, false, Encoding_Utf8)); | |
340 | |
341 Json::Value b; | |
342 FromDcmtkBridge::ToJson(b, *element, DicomToJsonFormat_Short, 0, Encoding_Ascii); | |
343 ASSERT_EQ("Hello", b["0010,0010"].asString()); | |
344 } | |
345 | |
346 { | |
347 Json::Value a; | |
348 a = "Hello"; | |
349 // Cannot assign a string to a sequence | |
350 ASSERT_THROW(element.reset(FromDcmtkBridge::FromJson(REFERENCED_STUDY_SEQUENCE, a, false, Encoding_Utf8)), OrthancException); | |
351 } | |
352 | |
353 { | |
354 Json::Value a = Json::arrayValue; | |
355 a.append("Hello"); | |
356 // Cannot assign an array to a string | |
357 ASSERT_THROW(element.reset(FromDcmtkBridge::FromJson(DICOM_TAG_PATIENT_NAME, a, false, Encoding_Utf8)), OrthancException); | |
358 } | |
359 | |
360 { | |
361 Json::Value a; | |
362 a = "data:application/octet-stream;base64,SGVsbG8="; // echo -n "Hello" | base64 | |
363 element.reset(FromDcmtkBridge::FromJson(DICOM_TAG_PATIENT_NAME, a, true, Encoding_Utf8)); | |
364 | |
365 Json::Value b; | |
366 FromDcmtkBridge::ToJson(b, *element, DicomToJsonFormat_Short, 0, Encoding_Ascii); | |
367 ASSERT_EQ("Hello", b["0010,0010"].asString()); | |
368 } | |
369 | |
370 { | |
371 Json::Value a = Json::arrayValue; | |
372 CreateSampleJson(a); | |
373 element.reset(FromDcmtkBridge::FromJson(REFERENCED_STUDY_SEQUENCE, a, true, Encoding_Utf8)); | |
374 | |
375 { | |
376 Json::Value b; | |
377 FromDcmtkBridge::ToJson(b, *element, DicomToJsonFormat_Short, 0, Encoding_Ascii); | |
378 ASSERT_EQ(Json::arrayValue, b["0008,1110"].type()); | |
379 ASSERT_EQ(2, b["0008,1110"].size()); | |
380 | |
381 Json::Value::ArrayIndex i = (b["0008,1110"][0]["0010,0010"].asString() == "Hello") ? 0 : 1; | |
382 | |
383 ASSERT_EQ(3, b["0008,1110"][i].size()); | |
384 ASSERT_EQ(2, b["0008,1110"][1 - i].size()); | |
385 ASSERT_EQ(b["0008,1110"][i]["0010,0010"].asString(), "Hello"); | |
386 ASSERT_EQ(b["0008,1110"][i]["0010,0020"].asString(), "World"); | |
387 ASSERT_EQ(b["0008,1110"][i]["0008,1030"].asString(), "Toto"); | |
388 ASSERT_EQ(b["0008,1110"][1 - i]["0010,0010"].asString(), "Hello2"); | |
389 ASSERT_EQ(b["0008,1110"][1 - i]["0010,0020"].asString(), "World2"); | |
390 } | |
391 | |
392 { | |
393 Json::Value b; | |
394 FromDcmtkBridge::ToJson(b, *element, DicomToJsonFormat_Full, 0, Encoding_Ascii); | |
395 | |
396 Json::Value c; | |
397 Toolbox::SimplifyTags(c, b); | |
398 | |
399 a[1]["PatientName"] = "Hello2"; // To remove the Data URI Scheme encoding | |
400 ASSERT_EQ(0, c["ReferencedStudySequence"].compare(a)); | |
401 } | |
402 } | |
403 } | |
404 | |
405 | |
406 | |
407 TEST(ParsedDicomFile, InsertReplaceStrings) | |
408 { | |
409 ParsedDicomFile f; | |
410 | |
411 f.Insert(DICOM_TAG_PATIENT_NAME, "World", false); | |
412 ASSERT_THROW(f.Insert(DICOM_TAG_PATIENT_ID, "Hello", false), OrthancException); // Already existing tag | |
413 f.Replace(DICOM_TAG_SOP_INSTANCE_UID, "Toto"); // (*) | |
414 f.Replace(DICOM_TAG_SOP_CLASS_UID, "Tata"); // (**) | |
415 | |
416 std::string s; | |
417 | |
418 ASSERT_THROW(f.Replace(DICOM_TAG_ACCESSION_NUMBER, "Accession", DicomReplaceMode_ThrowIfAbsent), OrthancException); | |
419 f.Replace(DICOM_TAG_ACCESSION_NUMBER, "Accession", DicomReplaceMode_IgnoreIfAbsent); | |
420 ASSERT_FALSE(f.GetTagValue(s, DICOM_TAG_ACCESSION_NUMBER)); | |
421 f.Replace(DICOM_TAG_ACCESSION_NUMBER, "Accession", DicomReplaceMode_InsertIfAbsent); | |
422 ASSERT_TRUE(f.GetTagValue(s, DICOM_TAG_ACCESSION_NUMBER)); | |
423 ASSERT_EQ(s, "Accession"); | |
424 f.Replace(DICOM_TAG_ACCESSION_NUMBER, "Accession2", DicomReplaceMode_IgnoreIfAbsent); | |
425 ASSERT_TRUE(f.GetTagValue(s, DICOM_TAG_ACCESSION_NUMBER)); | |
426 ASSERT_EQ(s, "Accession2"); | |
427 f.Replace(DICOM_TAG_ACCESSION_NUMBER, "Accession3", DicomReplaceMode_ThrowIfAbsent); | |
428 ASSERT_TRUE(f.GetTagValue(s, DICOM_TAG_ACCESSION_NUMBER)); | |
429 ASSERT_EQ(s, "Accession3"); | |
430 | |
431 ASSERT_TRUE(f.GetTagValue(s, DICOM_TAG_PATIENT_NAME)); | |
432 ASSERT_EQ(s, "World"); | |
433 ASSERT_TRUE(f.GetTagValue(s, DICOM_TAG_SOP_INSTANCE_UID)); | |
434 ASSERT_EQ(s, "Toto"); | |
435 ASSERT_TRUE(f.GetTagValue(s, DICOM_TAG_MEDIA_STORAGE_SOP_INSTANCE_UID)); // Implicitly modified by (*) | |
436 ASSERT_EQ(s, "Toto"); | |
437 ASSERT_TRUE(f.GetTagValue(s, DICOM_TAG_SOP_CLASS_UID)); | |
438 ASSERT_EQ(s, "Tata"); | |
439 ASSERT_TRUE(f.GetTagValue(s, DICOM_TAG_MEDIA_STORAGE_SOP_CLASS_UID)); // Implicitly modified by (**) | |
440 ASSERT_EQ(s, "Tata"); | |
441 } | |
442 | |
443 | |
444 | |
445 | |
446 TEST(ParsedDicomFile, InsertReplaceJson) | |
447 { | |
448 ParsedDicomFile f; | |
449 | |
450 Json::Value a; | |
451 CreateSampleJson(a); | |
452 | |
453 ASSERT_FALSE(f.HasTag(REFERENCED_STUDY_SEQUENCE)); | |
454 f.Remove(REFERENCED_STUDY_SEQUENCE); // No effect | |
455 f.Insert(REFERENCED_STUDY_SEQUENCE, a, true); | |
456 ASSERT_TRUE(f.HasTag(REFERENCED_STUDY_SEQUENCE)); | |
457 ASSERT_THROW(f.Insert(REFERENCED_STUDY_SEQUENCE, a, true), OrthancException); | |
458 f.Remove(REFERENCED_STUDY_SEQUENCE); | |
459 ASSERT_FALSE(f.HasTag(REFERENCED_STUDY_SEQUENCE)); | |
460 f.Insert(REFERENCED_STUDY_SEQUENCE, a, true); | |
461 ASSERT_TRUE(f.HasTag(REFERENCED_STUDY_SEQUENCE)); | |
462 | |
463 ASSERT_FALSE(f.HasTag(REFERENCED_PATIENT_SEQUENCE)); | |
464 ASSERT_THROW(f.Replace(REFERENCED_PATIENT_SEQUENCE, a, false, DicomReplaceMode_ThrowIfAbsent), OrthancException); | |
465 ASSERT_FALSE(f.HasTag(REFERENCED_PATIENT_SEQUENCE)); | |
466 f.Replace(REFERENCED_PATIENT_SEQUENCE, a, false, DicomReplaceMode_IgnoreIfAbsent); | |
467 ASSERT_FALSE(f.HasTag(REFERENCED_PATIENT_SEQUENCE)); | |
468 f.Replace(REFERENCED_PATIENT_SEQUENCE, a, false, DicomReplaceMode_InsertIfAbsent); | |
469 ASSERT_TRUE(f.HasTag(REFERENCED_PATIENT_SEQUENCE)); | |
470 | |
471 { | |
472 Json::Value b; | |
473 f.ToJson(b, DicomToJsonFormat_Full, 0); | |
474 | |
475 Json::Value c; | |
476 Toolbox::SimplifyTags(c, b); | |
477 | |
478 ASSERT_EQ(0, c["ReferencedPatientSequence"].compare(a)); | |
479 ASSERT_NE(0, c["ReferencedStudySequence"].compare(a)); // Because Data URI Scheme decoding was enabled | |
480 } | |
481 | |
482 a = "data:application/octet-stream;base64,VGF0YQ=="; // echo -n "Tata" | base64 | |
483 f.Replace(DICOM_TAG_SOP_INSTANCE_UID, a, false); // (*) | |
484 f.Replace(DICOM_TAG_SOP_CLASS_UID, a, true); // (**) | |
485 | |
486 std::string s; | |
487 ASSERT_TRUE(f.GetTagValue(s, DICOM_TAG_SOP_INSTANCE_UID)); | |
488 ASSERT_EQ(s, a.asString()); | |
489 ASSERT_TRUE(f.GetTagValue(s, DICOM_TAG_MEDIA_STORAGE_SOP_INSTANCE_UID)); // Implicitly modified by (*) | |
490 ASSERT_EQ(s, a.asString()); | |
491 ASSERT_TRUE(f.GetTagValue(s, DICOM_TAG_SOP_CLASS_UID)); | |
492 ASSERT_EQ(s, "Tata"); | |
493 ASSERT_TRUE(f.GetTagValue(s, DICOM_TAG_MEDIA_STORAGE_SOP_CLASS_UID)); // Implicitly modified by (**) | |
494 ASSERT_EQ(s, "Tata"); | |
495 } | |
496 | |
497 | |
498 TEST(ParsedDicomFile, JsonEncoding) | |
499 { | |
500 ParsedDicomFile f; | |
501 | |
502 for (unsigned int i = 0; i < testEncodingsCount; i++) | |
503 { | |
504 if (testEncodings[i] != Encoding_Windows1251) | |
505 { | |
506 //std::cout << EnumerationToString(testEncodings[i]) << std::endl; | |
507 f.SetEncoding(testEncodings[i]); | |
508 | |
509 if (testEncodings[i] != Encoding_Ascii) | |
510 { | |
511 ASSERT_EQ(testEncodings[i], f.GetEncoding()); | |
512 } | |
513 | |
514 Json::Value s = Toolbox::ConvertToUtf8(testEncodingsEncoded[i], testEncodings[i]); | |
515 f.Replace(DICOM_TAG_PATIENT_NAME, s, false); | |
516 | |
517 Json::Value v; | |
518 f.ToJson(v, DicomToJsonFormat_Simple, 0); | |
519 ASSERT_EQ(v["PatientName"].asString(), std::string(testEncodingsExpected[i])); | |
520 } | |
521 } | |
522 } |