Mercurial > hg > orthanc
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 } |