comparison OrthancServer/UnitTestsSources/UnitTestsMain.cpp @ 4055:9214e3a7b0a2 framework

moving FromDcmtkTests.cpp from OrthancServer to OrthancFramework
author Sebastien Jodogne <s.jodogne@gmail.com>
date Thu, 11 Jun 2020 12:52:09 +0200
parents 7ff1e6c80627
children 8b7cd69806f2
comparison
equal deleted inserted replaced
4054:9c37896a4457 4055:9214e3a7b0a2
39 #include "../../OrthancFramework/Sources/Logging.h" 39 #include "../../OrthancFramework/Sources/Logging.h"
40 #include "../../OrthancFramework/Sources/Toolbox.h" 40 #include "../../OrthancFramework/Sources/Toolbox.h"
41 #include "../../OrthancFramework/Sources/OrthancException.h" 41 #include "../../OrthancFramework/Sources/OrthancException.h"
42 #include "../../OrthancFramework/Sources/Images/Image.h" 42 #include "../../OrthancFramework/Sources/Images/Image.h"
43 #include "../../OrthancFramework/Sources/Images/PngWriter.h" 43 #include "../../OrthancFramework/Sources/Images/PngWriter.h"
44 #include "../../OrthancFramework/Sources/DicomParsing/FromDcmtkBridge.h"
45 #include "../../OrthancFramework/Sources/DicomParsing/ToDcmtkBridge.h"
44 46
45 #include "../Sources/OrthancConfiguration.h" // For the FontRegistry 47 #include "../Sources/OrthancConfiguration.h" // For the FontRegistry
46 #include "../Sources/OrthancInitialization.h" 48 #include "../Sources/OrthancInitialization.h"
47 #include "../Sources/ServerEnumerations.h" 49 #include "../Sources/ServerEnumerations.h"
50 #include "../Sources/ServerToolbox.h"
51 #include "../Plugins/Engine/PluginsEnumerations.h"
48 52
49 53
50 using namespace Orthanc; 54 using namespace Orthanc;
51 55
52 56
135 Orthanc::PngWriter w; 139 Orthanc::PngWriter w;
136 w.WriteToFile("UnitTestsResults/font.png", s); 140 w.WriteToFile("UnitTestsResults/font.png", s);
137 } 141 }
138 142
139 143
144 TEST(FromDcmtkBridge, ValueRepresentationConversions)
145 {
146 #if ORTHANC_ENABLE_PLUGINS == 1
147 ASSERT_EQ(1, ValueRepresentation_ApplicationEntity);
148 ASSERT_EQ(1, OrthancPluginValueRepresentation_AE);
149
150 for (int i = ValueRepresentation_ApplicationEntity;
151 i <= ValueRepresentation_NotSupported; i++)
152 {
153 ValueRepresentation vr = static_cast<ValueRepresentation>(i);
154
155 if (vr == ValueRepresentation_NotSupported)
156 {
157 ASSERT_THROW(ToDcmtkBridge::Convert(vr), OrthancException);
158 ASSERT_THROW(Plugins::Convert(vr), OrthancException);
159 }
160 else if (vr == ValueRepresentation_OtherDouble ||
161 vr == ValueRepresentation_OtherLong ||
162 vr == ValueRepresentation_UniversalResource ||
163 vr == ValueRepresentation_UnlimitedCharacters)
164 {
165 // These VR are not supported as of DCMTK 3.6.0
166 ASSERT_THROW(ToDcmtkBridge::Convert(vr), OrthancException);
167 ASSERT_EQ(OrthancPluginValueRepresentation_UN, Plugins::Convert(vr));
168 }
169 else
170 {
171 ASSERT_EQ(vr, FromDcmtkBridge::Convert(ToDcmtkBridge::Convert(vr)));
172
173 OrthancPluginValueRepresentation plugins = Plugins::Convert(vr);
174 ASSERT_EQ(vr, Plugins::Convert(plugins));
175 }
176 }
177
178 for (int i = OrthancPluginValueRepresentation_AE;
179 i <= OrthancPluginValueRepresentation_UT; i++)
180 {
181 OrthancPluginValueRepresentation plugins = static_cast<OrthancPluginValueRepresentation>(i);
182 ValueRepresentation orthanc = Plugins::Convert(plugins);
183 ASSERT_EQ(plugins, Plugins::Convert(orthanc));
184 }
185 #endif
186 }
187
188
189
190 namespace Orthanc
191 {
192 // Namespace for the "FRIEND_TEST()" directive in "FromDcmtkBridge" to apply:
193 // https://github.com/google/googletest/blob/master/googletest/docs/AdvancedGuide.md#private-class-members
194
195 static const DicomTag REFERENCED_STUDY_SEQUENCE(0x0008, 0x1110);
196 static const DicomTag REFERENCED_PATIENT_SEQUENCE(0x0008, 0x1120);
197
198 static void CreateSampleJson(Json::Value& a)
199 {
200 {
201 Json::Value b = Json::objectValue;
202 b["PatientName"] = "Hello";
203 b["PatientID"] = "World";
204 b["StudyDescription"] = "Toto";
205 a.append(b);
206 }
207
208 {
209 Json::Value b = Json::objectValue;
210 b["PatientName"] = "data:application/octet-stream;base64,SGVsbG8y"; // echo -n "Hello2" | base64
211 b["PatientID"] = "World2";
212 a.append(b);
213 }
214 }
215
216 TEST(FromDcmtkBridge, FromJson)
217 {
218 std::unique_ptr<DcmElement> element;
219
220 {
221 Json::Value a;
222 a = "Hello";
223 element.reset(FromDcmtkBridge::FromJson(DICOM_TAG_PATIENT_NAME, a, false, Encoding_Utf8, ""));
224
225 Json::Value b;
226 std::set<DicomTag> ignoreTagLength;
227 ignoreTagLength.insert(DICOM_TAG_PATIENT_ID);
228
229 FromDcmtkBridge::ElementToJson(b, *element, DicomToJsonFormat_Short,
230 DicomToJsonFlags_Default, 0, Encoding_Ascii, false, ignoreTagLength);
231 ASSERT_TRUE(b.isMember("0010,0010"));
232 ASSERT_EQ("Hello", b["0010,0010"].asString());
233
234 FromDcmtkBridge::ElementToJson(b, *element, DicomToJsonFormat_Short,
235 DicomToJsonFlags_Default, 3, Encoding_Ascii, false, ignoreTagLength);
236 ASSERT_TRUE(b["0010,0010"].isNull()); // "Hello" has more than 3 characters
237
238 FromDcmtkBridge::ElementToJson(b, *element, DicomToJsonFormat_Full,
239 DicomToJsonFlags_Default, 3, Encoding_Ascii, false, ignoreTagLength);
240 ASSERT_TRUE(b["0010,0010"].isObject());
241 ASSERT_EQ("PatientName", b["0010,0010"]["Name"].asString());
242 ASSERT_EQ("TooLong", b["0010,0010"]["Type"].asString());
243 ASSERT_TRUE(b["0010,0010"]["Value"].isNull());
244
245 ignoreTagLength.insert(DICOM_TAG_PATIENT_NAME);
246 FromDcmtkBridge::ElementToJson(b, *element, DicomToJsonFormat_Short,
247 DicomToJsonFlags_Default, 3, Encoding_Ascii, false, ignoreTagLength);
248 ASSERT_EQ("Hello", b["0010,0010"].asString());
249 }
250
251 {
252 Json::Value a;
253 a = "Hello";
254 // Cannot assign a string to a sequence
255 ASSERT_THROW(element.reset(FromDcmtkBridge::FromJson(REFERENCED_STUDY_SEQUENCE, a, false, Encoding_Utf8, "")), OrthancException);
256 }
257
258 {
259 Json::Value a = Json::arrayValue;
260 a.append("Hello");
261 // Cannot assign an array to a string
262 ASSERT_THROW(element.reset(FromDcmtkBridge::FromJson(DICOM_TAG_PATIENT_NAME, a, false, Encoding_Utf8, "")), OrthancException);
263 }
264
265 {
266 Json::Value a;
267 a = "data:application/octet-stream;base64,SGVsbG8="; // echo -n "Hello" | base64
268 element.reset(FromDcmtkBridge::FromJson(DICOM_TAG_PATIENT_NAME, a, true, Encoding_Utf8, ""));
269
270 Json::Value b;
271 std::set<DicomTag> ignoreTagLength;
272 FromDcmtkBridge::ElementToJson(b, *element, DicomToJsonFormat_Short,
273 DicomToJsonFlags_Default, 0, Encoding_Ascii, false, ignoreTagLength);
274 ASSERT_EQ("Hello", b["0010,0010"].asString());
275 }
276
277 {
278 Json::Value a = Json::arrayValue;
279 CreateSampleJson(a);
280 element.reset(FromDcmtkBridge::FromJson(REFERENCED_STUDY_SEQUENCE, a, true, Encoding_Utf8, ""));
281
282 {
283 Json::Value b;
284 std::set<DicomTag> ignoreTagLength;
285 FromDcmtkBridge::ElementToJson(b, *element, DicomToJsonFormat_Short,
286 DicomToJsonFlags_Default, 0, Encoding_Ascii, false, ignoreTagLength);
287 ASSERT_EQ(Json::arrayValue, b["0008,1110"].type());
288 ASSERT_EQ(2u, b["0008,1110"].size());
289
290 Json::Value::ArrayIndex i = (b["0008,1110"][0]["0010,0010"].asString() == "Hello") ? 0 : 1;
291
292 ASSERT_EQ(3u, b["0008,1110"][i].size());
293 ASSERT_EQ(2u, b["0008,1110"][1 - i].size());
294 ASSERT_EQ(b["0008,1110"][i]["0010,0010"].asString(), "Hello");
295 ASSERT_EQ(b["0008,1110"][i]["0010,0020"].asString(), "World");
296 ASSERT_EQ(b["0008,1110"][i]["0008,1030"].asString(), "Toto");
297 ASSERT_EQ(b["0008,1110"][1 - i]["0010,0010"].asString(), "Hello2");
298 ASSERT_EQ(b["0008,1110"][1 - i]["0010,0020"].asString(), "World2");
299 }
300
301 {
302 Json::Value b;
303 std::set<DicomTag> ignoreTagLength;
304 FromDcmtkBridge::ElementToJson(b, *element, DicomToJsonFormat_Full,
305 DicomToJsonFlags_Default, 0, Encoding_Ascii, false, ignoreTagLength);
306
307 Json::Value c;
308 Toolbox::SimplifyDicomAsJson(c, b, DicomToJsonFormat_Human);
309
310 a[1]["PatientName"] = "Hello2"; // To remove the Data URI Scheme encoding
311 ASSERT_EQ(0, c["ReferencedStudySequence"].compare(a));
312 }
313 }
314 }
315 }
316
317
140 int main(int argc, char **argv) 318 int main(int argc, char **argv)
141 { 319 {
142 Logging::Initialize(); 320 Logging::Initialize();
143 Toolbox::InitializeGlobalLocale(NULL); 321 Toolbox::InitializeGlobalLocale(NULL);
144 Logging::EnableInfoLevel(true); 322 Logging::EnableInfoLevel(true);