comparison UnitTestsSources/FromDcmtkTests.cpp @ 1693:558b25228a23

creation of tag hierarchy from json
author Sebastien Jodogne <s.jodogne@gmail.com>
date Thu, 08 Oct 2015 13:45:33 +0200
parents 4eaf164dd574
children 18c02c6987d5
comparison
equal deleted inserted replaced
1692:4eaf164dd574 1693:558b25228a23
302 ASSERT_EQ(ValueRepresentation_Other, 302 ASSERT_EQ(ValueRepresentation_Other,
303 FromDcmtkBridge::GetValueRepresentation(DICOM_TAG_PATIENT_ID)); 303 FromDcmtkBridge::GetValueRepresentation(DICOM_TAG_PATIENT_ID));
304 } 304 }
305 305
306 306
307
308 static const DicomTag REFERENCED_STUDY_SEQUENCE(0x0008, 0x1110);
309 static const DicomTag REFERENCED_PATIENT_SEQUENCE(0x0008, 0x1120);
310
311 static void CreateSampleJson(Json::Value& a)
312 {
313 {
314 Json::Value b = Json::objectValue;
315 b["PatientName"] = "Hello";
316 b["PatientID"] = "World";
317 b["StudyDescription"] = "Toto";
318 a.append(b);
319 }
320
321 {
322 Json::Value b = Json::objectValue;
323 b["PatientName"] = "data:application/octet-stream;base64,SGVsbG8y"; // echo -n "Hello2" | base64
324 b["PatientID"] = "World2";
325 a.append(b);
326 }
327 }
328
329
307 TEST(FromDcmtkBridge, FromJson) 330 TEST(FromDcmtkBridge, FromJson)
308 { 331 {
309 const DicomTag REFERENCED_STUDY_SEQUENCE(0x0008, 0x1110);
310
311 std::auto_ptr<DcmElement> element; 332 std::auto_ptr<DcmElement> element;
312 333
313 { 334 {
314 Json::Value a; 335 Json::Value a;
315 a = "Hello"; 336 a = "Hello";
316 element.reset(FromDcmtkBridge::FromJson(a, DICOM_TAG_PATIENT_NAME, false)); 337 element.reset(FromDcmtkBridge::FromJson(DICOM_TAG_PATIENT_NAME, a, false));
317 338
318 Json::Value b; 339 Json::Value b;
319 FromDcmtkBridge::ToJson(b, *element, DicomToJsonFormat_Short, 0, Encoding_Ascii); 340 FromDcmtkBridge::ToJson(b, *element, DicomToJsonFormat_Short, 0, Encoding_Ascii);
320 ASSERT_EQ("Hello", b["0010,0010"].asString()); 341 ASSERT_EQ("Hello", b["0010,0010"].asString());
321 } 342 }
322 343
323 { 344 {
324 Json::Value a; 345 Json::Value a;
325 a = "Hello"; 346 a = "Hello";
326 // Cannot assign a string to a sequence 347 // Cannot assign a string to a sequence
327 ASSERT_THROW(element.reset(FromDcmtkBridge::FromJson(a, REFERENCED_STUDY_SEQUENCE, false)), OrthancException); 348 ASSERT_THROW(element.reset(FromDcmtkBridge::FromJson(REFERENCED_STUDY_SEQUENCE, a, false)), OrthancException);
328 } 349 }
329 350
330 { 351 {
331 Json::Value a = Json::arrayValue; 352 Json::Value a = Json::arrayValue;
332 a.append("Hello"); 353 a.append("Hello");
333 // Cannot assign an array to a string 354 // Cannot assign an array to a string
334 ASSERT_THROW(element.reset(FromDcmtkBridge::FromJson(a, DICOM_TAG_PATIENT_NAME, false)), OrthancException); 355 ASSERT_THROW(element.reset(FromDcmtkBridge::FromJson(DICOM_TAG_PATIENT_NAME, a, false)), OrthancException);
335 } 356 }
336 357
337 { 358 {
338 Json::Value a; 359 Json::Value a;
339 a = "data:application/octet-stream;base64,SGVsbG8="; // echo -n "Hello" | base64 360 a = "data:application/octet-stream;base64,SGVsbG8="; // echo -n "Hello" | base64
340 element.reset(FromDcmtkBridge::FromJson(a, DICOM_TAG_PATIENT_NAME, true)); 361 element.reset(FromDcmtkBridge::FromJson(DICOM_TAG_PATIENT_NAME, a, true));
341 362
342 Json::Value b; 363 Json::Value b;
343 FromDcmtkBridge::ToJson(b, *element, DicomToJsonFormat_Short, 0, Encoding_Ascii); 364 FromDcmtkBridge::ToJson(b, *element, DicomToJsonFormat_Short, 0, Encoding_Ascii);
344 ASSERT_EQ("Hello", b["0010,0010"].asString()); 365 ASSERT_EQ("Hello", b["0010,0010"].asString());
345 } 366 }
346 367
347 { 368 {
348 Json::Value a = Json::arrayValue; 369 Json::Value a = Json::arrayValue;
349 370 CreateSampleJson(a);
350 { 371 element.reset(FromDcmtkBridge::FromJson(REFERENCED_STUDY_SEQUENCE, a, true));
351 Json::Value b = Json::objectValue;
352 b["PatientName"] = "Hello";
353 b["PatientID"] = "World";
354 b["StudyDescription"] = "Toto";
355 a.append(b);
356 }
357
358 {
359 Json::Value b = Json::objectValue;
360 b["PatientName"] = "Hello2";
361 b["PatientID"] = "World2";
362 a.append(b);
363 }
364
365 element.reset(FromDcmtkBridge::FromJson(a, REFERENCED_STUDY_SEQUENCE, false));
366 372
367 { 373 {
368 Json::Value b; 374 Json::Value b;
369 FromDcmtkBridge::ToJson(b, *element, DicomToJsonFormat_Short, 0, Encoding_Ascii); 375 FromDcmtkBridge::ToJson(b, *element, DicomToJsonFormat_Short, 0, Encoding_Ascii);
370 ASSERT_EQ(Json::arrayValue, b["0008,1110"].type()); 376 ASSERT_EQ(Json::arrayValue, b["0008,1110"].type());
386 FromDcmtkBridge::ToJson(b, *element, DicomToJsonFormat_Full, 0, Encoding_Ascii); 392 FromDcmtkBridge::ToJson(b, *element, DicomToJsonFormat_Full, 0, Encoding_Ascii);
387 393
388 Json::Value c; 394 Json::Value c;
389 SimplifyTags(c, b); 395 SimplifyTags(c, b);
390 396
397 a[1]["PatientName"] = "Hello2"; // To remove the Data URI Scheme encoding
391 ASSERT_EQ(0, c["ReferencedStudySequence"].compare(a)); 398 ASSERT_EQ(0, c["ReferencedStudySequence"].compare(a));
392 } 399 }
393 } 400 }
394 } 401 }
402
403
404
405 TEST(ParsedDicomFile, InsertReplaceStrings)
406 {
407 ParsedDicomFile f;
408
409 f.Insert(DICOM_TAG_PATIENT_NAME, "World");
410 ASSERT_THROW(f.Insert(DICOM_TAG_PATIENT_ID, "Hello"), OrthancException); // Already existing tag
411 f.Replace(DICOM_TAG_SOP_INSTANCE_UID, "Toto"); // (*)
412 f.Replace(DICOM_TAG_SOP_CLASS_UID, "Tata"); // (**)
413
414 std::string s;
415
416 ASSERT_THROW(f.Replace(DICOM_TAG_ACCESSION_NUMBER, "Accession", DicomReplaceMode_ThrowIfAbsent), OrthancException);
417 f.Replace(DICOM_TAG_ACCESSION_NUMBER, "Accession", DicomReplaceMode_IgnoreIfAbsent);
418 ASSERT_FALSE(f.GetTagValue(s, DICOM_TAG_ACCESSION_NUMBER));
419 f.Replace(DICOM_TAG_ACCESSION_NUMBER, "Accession", DicomReplaceMode_InsertIfAbsent);
420 ASSERT_TRUE(f.GetTagValue(s, DICOM_TAG_ACCESSION_NUMBER));
421 ASSERT_EQ(s, "Accession");
422 f.Replace(DICOM_TAG_ACCESSION_NUMBER, "Accession2", DicomReplaceMode_IgnoreIfAbsent);
423 ASSERT_TRUE(f.GetTagValue(s, DICOM_TAG_ACCESSION_NUMBER));
424 ASSERT_EQ(s, "Accession2");
425 f.Replace(DICOM_TAG_ACCESSION_NUMBER, "Accession3", DicomReplaceMode_ThrowIfAbsent);
426 ASSERT_TRUE(f.GetTagValue(s, DICOM_TAG_ACCESSION_NUMBER));
427 ASSERT_EQ(s, "Accession3");
428
429 ASSERT_TRUE(f.GetTagValue(s, DICOM_TAG_PATIENT_NAME));
430 ASSERT_EQ(s, "World");
431 ASSERT_TRUE(f.GetTagValue(s, DICOM_TAG_SOP_INSTANCE_UID));
432 ASSERT_EQ(s, "Toto");
433 ASSERT_TRUE(f.GetTagValue(s, DICOM_TAG_MEDIA_STORAGE_SOP_INSTANCE_UID)); // Implicitly modified by (*)
434 ASSERT_EQ(s, "Toto");
435 ASSERT_TRUE(f.GetTagValue(s, DICOM_TAG_SOP_CLASS_UID));
436 ASSERT_EQ(s, "Tata");
437 ASSERT_TRUE(f.GetTagValue(s, DICOM_TAG_MEDIA_STORAGE_SOP_CLASS_UID)); // Implicitly modified by (**)
438 ASSERT_EQ(s, "Tata");
439 }
440
441
442
443
444 TEST(ParsedDicomFile, InsertReplaceJson)
445 {
446 ParsedDicomFile f;
447
448 Json::Value a;
449 CreateSampleJson(a);
450
451 ASSERT_FALSE(f.HasTag(REFERENCED_STUDY_SEQUENCE));
452 f.Remove(REFERENCED_STUDY_SEQUENCE); // No effect
453 f.Insert(REFERENCED_STUDY_SEQUENCE, a, true);
454 ASSERT_TRUE(f.HasTag(REFERENCED_STUDY_SEQUENCE));
455 ASSERT_THROW(f.Insert(REFERENCED_STUDY_SEQUENCE, a, true), OrthancException);
456 f.Remove(REFERENCED_STUDY_SEQUENCE);
457 ASSERT_FALSE(f.HasTag(REFERENCED_STUDY_SEQUENCE));
458 f.Insert(REFERENCED_STUDY_SEQUENCE, a, true);
459 ASSERT_TRUE(f.HasTag(REFERENCED_STUDY_SEQUENCE));
460
461 ASSERT_FALSE(f.HasTag(REFERENCED_PATIENT_SEQUENCE));
462 ASSERT_THROW(f.Replace(REFERENCED_PATIENT_SEQUENCE, a, false, DicomReplaceMode_ThrowIfAbsent), OrthancException);
463 ASSERT_FALSE(f.HasTag(REFERENCED_PATIENT_SEQUENCE));
464 f.Replace(REFERENCED_PATIENT_SEQUENCE, a, false, DicomReplaceMode_IgnoreIfAbsent);
465 ASSERT_FALSE(f.HasTag(REFERENCED_PATIENT_SEQUENCE));
466 f.Replace(REFERENCED_PATIENT_SEQUENCE, a, false, DicomReplaceMode_InsertIfAbsent);
467 ASSERT_TRUE(f.HasTag(REFERENCED_PATIENT_SEQUENCE));
468
469 {
470 Json::Value b;
471 f.ToJson(b, DicomToJsonFormat_Full, 0);
472
473 Json::Value c;
474 SimplifyTags(c, b);
475
476 ASSERT_EQ(0, c["ReferencedPatientSequence"].compare(a));
477 ASSERT_NE(0, c["ReferencedStudySequence"].compare(a)); // Because Data URI Scheme decoding was enabled
478 }
479
480 a = "data:application/octet-stream;base64,VGF0YQ=="; // echo -n "Tata" | base64
481 f.Replace(DICOM_TAG_SOP_INSTANCE_UID, a, false); // (*)
482 f.Replace(DICOM_TAG_SOP_CLASS_UID, a, true); // (**)
483
484 std::string s;
485 ASSERT_TRUE(f.GetTagValue(s, DICOM_TAG_SOP_INSTANCE_UID));
486 ASSERT_EQ(s, a.asString());
487 ASSERT_TRUE(f.GetTagValue(s, DICOM_TAG_MEDIA_STORAGE_SOP_INSTANCE_UID)); // Implicitly modified by (*)
488 ASSERT_EQ(s, a.asString());
489 ASSERT_TRUE(f.GetTagValue(s, DICOM_TAG_SOP_CLASS_UID));
490 ASSERT_EQ(s, "Tata");
491 ASSERT_TRUE(f.GetTagValue(s, DICOM_TAG_MEDIA_STORAGE_SOP_CLASS_UID)); // Implicitly modified by (**)
492 ASSERT_EQ(s, "Tata");
493 }