diff OrthancFramework/UnitTestsSources/FromDcmtkTests.cpp @ 4681:c5528c7847a6

new class DicomPath
author Sebastien Jodogne <s.jodogne@gmail.com>
date Mon, 07 Jun 2021 17:05:48 +0200
parents 11bfea08341a
children d38a7040474a
line wrap: on
line diff
--- a/OrthancFramework/UnitTestsSources/FromDcmtkTests.cpp	Sat Jun 05 12:23:54 2021 +0200
+++ b/OrthancFramework/UnitTestsSources/FromDcmtkTests.cpp	Mon Jun 07 17:05:48 2021 +0200
@@ -36,12 +36,13 @@
 #include <gtest/gtest.h>
 
 #include "../Sources/Compatibility.h"
+#include "../Sources/DicomFormat/DicomPath.h"
 #include "../Sources/DicomNetworking/DicomFindAnswers.h"
 #include "../Sources/DicomParsing/DicomModification.h"
 #include "../Sources/DicomParsing/DicomWebJsonVisitor.h"
 #include "../Sources/DicomParsing/FromDcmtkBridge.h"
+#include "../Sources/DicomParsing/ParsedDicomCache.h"
 #include "../Sources/DicomParsing/ToDcmtkBridge.h"
-#include "../Sources/DicomParsing/ParsedDicomCache.h"
 #include "../Sources/Endianness.h"
 #include "../Sources/Images/Image.h"
 #include "../Sources/Images/ImageBuffer.h"
@@ -50,6 +51,7 @@
 #include "../Sources/Images/PngWriter.h"
 #include "../Sources/Logging.h"
 #include "../Sources/OrthancException.h"
+
 #include "../Resources/CodeGeneration/EncodingTests.h"
 
 #if ORTHANC_SANDBOXED != 1
@@ -2256,6 +2258,100 @@
 }
 
 
+TEST(DicomModification, DicomPath)
+{
+  // Those are samples inspired by those from "man dcmodify"
+
+  static const DicomTag DICOM_TAG_ACQUISITION_MATRIX(0x0018, 0x1310);
+  static const DicomTag DICOM_TAG_REFERENCED_PERFORMED_PROCEDURE_STEP_SEQUENCE(0x0008, 0x1111);
+
+  DicomPath path = DicomPath::Parse("(0010,0010)", true);
+  ASSERT_EQ(0u, path.GetPrefixLength());
+  ASSERT_EQ(DICOM_TAG_PATIENT_NAME, path.GetFinalTag());
+  ASSERT_THROW(path.GetPrefixTag(0), OrthancException);
+
+  path = DicomPath::Parse("0018,1310", true);
+  ASSERT_EQ(0u, path.GetPrefixLength());
+  ASSERT_EQ(DICOM_TAG_ACQUISITION_MATRIX, path.GetFinalTag());
+  ASSERT_EQ("(0018,1310)", path.Format());
+
+  // The following sample won't work without DCMTK
+  path = DicomPath::Parse("PatientID", true);
+  ASSERT_EQ(0u, path.GetPrefixLength());
+  ASSERT_EQ(DICOM_TAG_PATIENT_ID, path.GetFinalTag());
+  ASSERT_EQ("(0010,0020)", path.Format());
+
+  path = DicomPath::Parse("(0018,1310)", true);
+  ASSERT_EQ(0u, path.GetPrefixLength());
+  ASSERT_EQ(DICOM_TAG_ACQUISITION_MATRIX, path.GetFinalTag());
+  ASSERT_EQ("(0018,1310)", path.Format());
+
+  path = DicomPath::Parse("(0008,1111)[0].PatientName", true);
+  ASSERT_EQ(1u, path.GetPrefixLength());
+  ASSERT_EQ(DICOM_TAG_REFERENCED_PERFORMED_PROCEDURE_STEP_SEQUENCE, path.GetPrefixTag(0));
+  ASSERT_FALSE(path.IsPrefixUniversal(0));
+  ASSERT_EQ(0, path.GetPrefixIndex(0));
+  ASSERT_THROW(path.GetPrefixTag(1), OrthancException);
+  ASSERT_EQ(DICOM_TAG_PATIENT_NAME, path.GetFinalTag());
+  
+  path = DicomPath::Parse("(0008,1111)[1].(0008,1111)[2].(0010,0010)", true);
+  ASSERT_EQ(2u, path.GetPrefixLength());
+  ASSERT_EQ(DICOM_TAG_REFERENCED_PERFORMED_PROCEDURE_STEP_SEQUENCE, path.GetPrefixTag(0));
+  ASSERT_FALSE(path.IsPrefixUniversal(0));
+  ASSERT_EQ(1, path.GetPrefixIndex(0));
+  ASSERT_EQ(DICOM_TAG_REFERENCED_PERFORMED_PROCEDURE_STEP_SEQUENCE, path.GetPrefixTag(1));
+  ASSERT_FALSE(path.IsPrefixUniversal(1));
+  ASSERT_EQ(2, path.GetPrefixIndex(1));
+  ASSERT_THROW(path.GetPrefixTag(2), OrthancException);
+  ASSERT_EQ(DICOM_TAG_PATIENT_NAME, path.GetFinalTag());
+  
+  path = DicomPath::Parse("(0008,1111)[*].PatientName", true);
+  ASSERT_EQ(1u, path.GetPrefixLength());
+  ASSERT_EQ(DICOM_TAG_REFERENCED_PERFORMED_PROCEDURE_STEP_SEQUENCE, path.GetPrefixTag(0));
+  ASSERT_TRUE(path.IsPrefixUniversal(0));
+  ASSERT_THROW(path.GetPrefixIndex(0), OrthancException);
+  ASSERT_THROW(path.GetPrefixTag(1), OrthancException);
+  ASSERT_EQ(DICOM_TAG_PATIENT_NAME, path.GetFinalTag());
+  ASSERT_EQ("(0008,1111)[*].(0010,0010)", path.Format());
+  
+  ASSERT_THROW(DicomPath::Parse("(0008,1111)[*].PatientName", false), OrthancException);
+  
+  path = DicomPath::Parse("(0008,1111)[1].(0008,1111)[*].(0010,0010)", true);
+  ASSERT_EQ(2u, path.GetPrefixLength());
+  ASSERT_EQ(DICOM_TAG_REFERENCED_PERFORMED_PROCEDURE_STEP_SEQUENCE, path.GetPrefixTag(0));
+  ASSERT_FALSE(path.IsPrefixUniversal(0));
+  ASSERT_EQ(1, path.GetPrefixIndex(0));
+  ASSERT_EQ(DICOM_TAG_REFERENCED_PERFORMED_PROCEDURE_STEP_SEQUENCE, path.GetPrefixTag(0));
+  ASSERT_TRUE(path.IsPrefixUniversal(1));
+  ASSERT_THROW(path.GetPrefixIndex(1), OrthancException);
+  ASSERT_THROW(path.GetPrefixTag(2), OrthancException);
+  ASSERT_EQ(DICOM_TAG_PATIENT_NAME, path.GetFinalTag());
+  
+  path = DicomPath::Parse("PatientID[1].PatientName", true);
+  ASSERT_EQ(1u, path.GetPrefixLength());
+  ASSERT_EQ(DICOM_TAG_PATIENT_ID, path.GetPrefixTag(0));
+  ASSERT_FALSE(path.IsPrefixUniversal(0));
+  ASSERT_EQ(1, path.GetPrefixIndex(0));
+  ASSERT_THROW(path.GetPrefixTag(1), OrthancException);
+  ASSERT_EQ(DICOM_TAG_PATIENT_NAME, path.GetFinalTag());
+
+  path = DicomPath::Parse("     PatientID    [  42   ]    .    PatientName     ", true);
+  ASSERT_EQ(1u, path.GetPrefixLength());
+  ASSERT_EQ(DICOM_TAG_PATIENT_ID, path.GetPrefixTag(0));
+  ASSERT_FALSE(path.IsPrefixUniversal(0));
+  ASSERT_EQ(42, path.GetPrefixIndex(0));
+  ASSERT_THROW(path.GetPrefixTag(1), OrthancException);
+  ASSERT_EQ(DICOM_TAG_PATIENT_NAME, path.GetFinalTag());
+  ASSERT_EQ("(0010,0020)[42].(0010,0010)", path.Format());
+
+  ASSERT_THROW(DicomPath::Parse("nope", true), OrthancException);
+  ASSERT_THROW(DicomPath::Parse("(0010,0010)[.PatientID", true), OrthancException);
+  ASSERT_THROW(DicomPath::Parse("(0010,0010)[].PatientID", true), OrthancException);
+  ASSERT_THROW(DicomPath::Parse("(0010,0010[].PatientID", true), OrthancException);
+  ASSERT_THROW(DicomPath::Parse("(0010,0010)0].PatientID", true), OrthancException);
+  ASSERT_THROW(DicomPath::Parse("(0010,0010)[-1].PatientID", true), OrthancException);
+}
+
 
 
 #if ORTHANC_ENABLE_DCMTK_TRANSCODING == 1