Mercurial > hg > orthanc
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); |