1 /*
2  *
3  *  Copyright (C) 2019-2020, OFFIS e.V.
4  *  All rights reserved.  See COPYRIGHT file for details.
5  *
6  *  This software and supporting documentation were developed by
7  *
8  *    OFFIS e.V.
9  *    R&D Division Health
10  *    Escherweg 2
11  *    D-26121 Oldenburg, Germany
12  *
13  *
14  *  Module:  dcmect
15  *
16  *  Author:  Michael Onken
17  *
18  *  Purpose: Tests for dcmiod's Code Sequence Macro implementation
19  *
20  */
21 
22 #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */
23 #include "dcmtk/dcmiod/iodmacro.h"
24 #include "dcmtk/ofstd/oftest.h"
25 
26 static OFLogger tCodeLogger = OFLog::getLogger("dcmtk.test.t_codes");
27 
28 static void clearCode(CodeSequenceMacro& c);
29 
OFTEST(dcmiod_codes)30 OFTEST(dcmiod_codes)
31 {
32     // Make sure data dictionary is loaded
33     if (!dcmDataDict.isDictionaryLoaded())
34     {
35         OFCHECK_FAIL("no data dictionary loaded, check environment variable: " DCM_DICT_ENVIRONMENT_VARIABLE);
36         return;
37     }
38 
39     // Most basic, classic "Code Value" variant
40     CodeSequenceMacro c("Value", "99DCMTK", "Classic code", "Version 1");
41     OFCHECK(c.check().good());
42     OFString val;
43     OFCHECK(c.getCodeValue(val, -1, OFTrue /* autoTag */).good());
44     OFCHECK(val == "Value");
45     OFCHECK(c.getCodeValue(val, -1, OFFalse /* autoTag off */).good());
46     OFCHECK(val == "Value");
47     OFCHECK(c.getCodingSchemeDesignator(val).good());
48     OFCHECK(val == "99DCMTK");
49     OFCHECK(c.getCodeMeaning(val).good());
50     OFCHECK(val == "Classic code");
51     OFCHECK(c.getCodingSchemeVersion(val).good());
52     OFCHECK(val == "Version 1");
53     OFCHECK(c.getLongCodeValue(val).bad());
54     OFCHECK(c.getURNCodeValue(val).bad());
55     OFCHECK(c.check().good());
56 
57     clearCode(c);
58     val.clear();
59 
60     // "URN Code Value" variant
61     OFCHECK(c.set("http://www.open-connections.de", "99DCMTK", "URN code", "Version 1", OFTrue, OFTrue /* autoTag */)
62                 .good());
63     OFCHECK(c.check().good());
64     OFCHECK(c.getCodeValue(val, -1, OFTrue /* autoTag */).good());
65     OFCHECK(val == "http://www.open-connections.de");
66     val.clear();
67     OFCHECK(c.getCodeValue(val, -1, OFFalse /* autoTag off */).bad());
68     OFCHECK(val.empty());
69     OFCHECK(c.getCodingSchemeDesignator(val).good());
70     OFCHECK(val == "99DCMTK");
71     OFCHECK(c.getCodeMeaning(val).good());
72     OFCHECK(val == "URN code");
73     OFCHECK(c.getCodingSchemeVersion(val).good());
74     OFCHECK(val == "Version 1");
75     OFCHECK(c.getLongCodeValue(val).bad());
76     OFCHECK(c.getURNCodeValue(val).good());
77     OFCHECK(val == "http://www.open-connections.de");
78     OFCHECK(c.check().good());
79 
80     clearCode(c);
81     val.clear();
82 
83     // "Long Code Value" variant
84     OFCHECK(c.set("Open Connections GmbH", "99DCMTK", "Long code", "Version 1", OFTrue, OFTrue /* autoTag */).good());
85     OFCHECK(c.check().good());
86     OFCHECK(c.getCodeValue(val, -1, OFTrue /* autoTag */).good());
87     OFCHECK(val == "Open Connections GmbH");
88     val.clear();
89     OFCHECK(c.getCodeValue(val, -1, OFFalse /* autoTag off */).bad());
90     OFCHECK(val.empty());
91     OFCHECK(c.getCodingSchemeDesignator(val).good());
92     OFCHECK(val == "99DCMTK");
93     OFCHECK(c.getCodeMeaning(val).good());
94     OFCHECK(val == "Long code");
95     OFCHECK(c.getCodingSchemeVersion(val).good());
96     OFCHECK(val == "Version 1");
97     OFCHECK(c.getURNCodeValue(val).bad());
98     OFCHECK(c.getLongCodeValue(val).good());
99     OFCHECK(val == "Open Connections GmbH");
100     OFCHECK(c.check().good());
101 
102     clearCode(c);
103     val.clear();
104 
105     // Check only single code value is set internally (old values are deleted)
106     OFCHECK(c.set("http://www.open-connections.de", "99DCMTK", "URN code", "Version 1", OFTrue, OFTrue /* autoTag */)
107                 .good());
108     OFCHECK(c.set("Value", "99DCMTK", "Classic code", "Version 1").good());
109     OFCHECK(c.getLongCodeValue(val).bad());
110     OFCHECK(c.getURNCodeValue(val).bad());
111 
112     clearCode(c);
113     val.clear();
114 
115     OFCHECK(c.set("http://www.open-connections.de", "99DCMTK", "URN code", "Version 1", OFTrue, OFTrue /* autoTag */)
116                 .good());
117     OFCHECK(c.set("Open Connections GmbH", "99DCMTK", "Long code", "Version 1", OFTrue, OFTrue /* autoTag */).good());
118     OFCHECK(c.getURNCodeValue(val).bad());
119     OFCHECK(c.getCodeValue(val, -1, OFFalse /*autoTag off */).bad());
120 
121     clearCode(c);
122     val.clear();
123 
124     // Failure: URN Code Value without autoTag
125     OFCHECK(c.set("http://www.open-connections.de/this/url/is/over/64/characters/long",
126                   "99DCMTK",
127                   "URN code",
128                   "Version 1",
129                   OFTrue,
130                   OFFalse /* autoTag off */)
131                 .bad());
132     OFCHECK(c.check().bad());
133 
134     clearCode(c);
135     val.clear();
136 
137     // Failure: Long Code Value without autoTag
138     OFCHECK(c.set("Open Connections GmbH, Oldenburg, Germany, c/o Name over 64 characters long",
139                   "99DCMTK",
140                   "URN code",
141                   "Version 1",
142                   OFTrue,
143                   OFFalse /* autoTag off */)
144                 .bad());
145     OFCHECK(c.check().bad());
146 }
147 
clearCode(CodeSequenceMacro & c)148 static void clearCode(CodeSequenceMacro& c)
149 {
150     c.clearData();
151     OFString val;
152     c.getCodeValue(val);
153     OFCHECK(val.empty());
154     c.getURNCodeValue(val);
155     OFCHECK(val.empty());
156     c.getLongCodeValue(val);
157     OFCHECK(val.empty());
158     c.getCodingSchemeDesignator(val);
159     OFCHECK(val.empty());
160     c.getCodeMeaning(val);
161     OFCHECK(val.empty());
162     c.getCodingSchemeVersion(val);
163     OFCHECK(val.empty());
164 }
165