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 }