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