Mercurial > hg > orthanc
comparison OrthancFramework/UnitTestsSources/FromDcmtkTests.cpp @ 4063:e00f3d089991 framework
shared library of orthanc framework
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Thu, 11 Jun 2020 16:40:34 +0200 |
parents | 0953b3dc3261 |
children | d6362b2c4b61 |
comparison
equal
deleted
inserted
replaced
4062:0953b3dc3261 | 4063:e00f3d089991 |
---|---|
30 * along with this program. If not, see <http://www.gnu.org/licenses/>. | 30 * along with this program. If not, see <http://www.gnu.org/licenses/>. |
31 **/ | 31 **/ |
32 | 32 |
33 | 33 |
34 #if ORTHANC_UNIT_TESTS_LINK_FRAMEWORK == 1 | 34 #if ORTHANC_UNIT_TESTS_LINK_FRAMEWORK == 1 |
35 // Must be the first to be sure to use the Orthanc framework shared library | |
35 # include <OrthancFramework.h> | 36 # include <OrthancFramework.h> |
37 #endif | |
38 | |
39 #if !defined(ORTHANC_ENABLE_DCMTK_TRANSCODING) | |
40 # error ORTHANC_ENABLE_DCMTK_TRANSCODING is not defined | |
41 #endif | |
42 | |
43 #if !defined(ORTHANC_ENABLE_PUGIXML) | |
44 # error ORTHANC_ENABLE_PUGIXML is not defined | |
36 #endif | 45 #endif |
37 | 46 |
38 #include <gtest/gtest.h> | 47 #include <gtest/gtest.h> |
39 | 48 |
40 #include "../Sources/Compatibility.h" | 49 #include "../Sources/Compatibility.h" |
52 #include "../Sources/Images/PngWriter.h" | 61 #include "../Sources/Images/PngWriter.h" |
53 #include "../Sources/OrthancException.h" | 62 #include "../Sources/OrthancException.h" |
54 #include "../Sources/SystemToolbox.h" | 63 #include "../Sources/SystemToolbox.h" |
55 #include "../Resources/CodeGeneration/EncodingTests.h" | 64 #include "../Resources/CodeGeneration/EncodingTests.h" |
56 | 65 |
66 #include <dcmtk/dcmdata/dcdeftag.h> | |
57 #include <dcmtk/dcmdata/dcelem.h> | 67 #include <dcmtk/dcmdata/dcelem.h> |
58 #include <dcmtk/dcmdata/dcdeftag.h> | 68 #include <dcmtk/dcmdata/dcvrat.h> |
69 | |
59 #include <boost/algorithm/string/predicate.hpp> | 70 #include <boost/algorithm/string/predicate.hpp> |
60 | 71 |
61 #if ORTHANC_ENABLE_PUGIXML == 1 | 72 #if ORTHANC_ENABLE_PUGIXML == 1 |
62 # include <pugixml.hpp> | 73 # include <pugixml.hpp> |
74 # if !defined(PUGIXML_VERSION) | |
75 # error PUGIXML_VERSION is not available | |
76 # endif | |
63 #endif | 77 #endif |
64 | 78 |
65 using namespace Orthanc; | 79 using namespace Orthanc; |
66 | 80 |
67 TEST(DicomFormat, Tag) | 81 TEST(DicomFormat, Tag) |
1774 ASSERT_EQ(std::string(reinterpret_cast<const char*>(line3), sizeof(line3)), lines[2]); | 1788 ASSERT_EQ(std::string(reinterpret_cast<const char*>(line3), sizeof(line3)), lines[2]); |
1775 ASSERT_TRUE(lines[3].empty()); | 1789 ASSERT_TRUE(lines[3].empty()); |
1776 } | 1790 } |
1777 | 1791 |
1778 | 1792 |
1793 static void SetTagKey(ParsedDicomFile& dicom, | |
1794 const DicomTag& tag, | |
1795 const DicomTag& value) | |
1796 { | |
1797 // This function emulates a call to function | |
1798 // "dicom.GetDcmtkObject().getDataset()->putAndInsertTagKey(tag, | |
1799 // value)" that was not available in DCMTK 3.6.0 | |
1800 | |
1801 std::unique_ptr<DcmAttributeTag> element(new DcmAttributeTag(ToDcmtkBridge::Convert(tag))); | |
1802 | |
1803 DcmTagKey v = ToDcmtkBridge::Convert(value); | |
1804 if (!element->putTagVal(v).good()) | |
1805 { | |
1806 throw OrthancException(ErrorCode_InternalError); | |
1807 } | |
1808 | |
1809 dicom.GetDcmtkObject().getDataset()->insert(element.release()); | |
1810 } | |
1811 | |
1812 | |
1813 TEST(DicomWebJson, ValueRepresentation) | |
1814 { | |
1815 // http://dicom.nema.org/medical/dicom/current/output/chtml/part18/sect_F.2.3.html | |
1816 | |
1817 ParsedDicomFile dicom(false); | |
1818 dicom.ReplacePlainString(DicomTag(0x0040, 0x0241), "AE"); | |
1819 dicom.ReplacePlainString(DicomTag(0x0010, 0x1010), "AS"); | |
1820 SetTagKey(dicom, DicomTag(0x0020, 0x9165), DicomTag(0x0010, 0x0020)); | |
1821 dicom.ReplacePlainString(DicomTag(0x0008, 0x0052), "CS"); | |
1822 dicom.ReplacePlainString(DicomTag(0x0008, 0x0012), "DA"); | |
1823 dicom.ReplacePlainString(DicomTag(0x0010, 0x1020), "42"); // DS | |
1824 dicom.ReplacePlainString(DicomTag(0x0008, 0x002a), "DT"); | |
1825 dicom.ReplacePlainString(DicomTag(0x0010, 0x9431), "43"); // FL | |
1826 dicom.ReplacePlainString(DicomTag(0x0008, 0x1163), "44"); // FD | |
1827 dicom.ReplacePlainString(DicomTag(0x0008, 0x1160), "45"); // IS | |
1828 dicom.ReplacePlainString(DicomTag(0x0008, 0x0070), "LO"); | |
1829 dicom.ReplacePlainString(DicomTag(0x0010, 0x4000), "LT"); | |
1830 dicom.ReplacePlainString(DicomTag(0x0028, 0x2000), "OB"); | |
1831 dicom.ReplacePlainString(DicomTag(0x7fe0, 0x0009), "3.14159"); // OD (other double) | |
1832 dicom.ReplacePlainString(DicomTag(0x0064, 0x0009), "2.71828"); // OF (other float) | |
1833 dicom.ReplacePlainString(DicomTag(0x0066, 0x0040), "46"); // OL (other long) | |
1834 ASSERT_THROW(dicom.ReplacePlainString(DicomTag(0x0028, 0x1201), "O"), OrthancException); | |
1835 dicom.ReplacePlainString(DicomTag(0x0028, 0x1201), "OWOW"); | |
1836 dicom.ReplacePlainString(DicomTag(0x0010, 0x0010), "PN"); | |
1837 dicom.ReplacePlainString(DicomTag(0x0008, 0x0050), "SH"); | |
1838 dicom.ReplacePlainString(DicomTag(0x0018, 0x6020), "-15"); // SL | |
1839 dicom.ReplacePlainString(DicomTag(0x0018, 0x9219), "-16"); // SS | |
1840 dicom.ReplacePlainString(DicomTag(0x0008, 0x0081), "ST"); | |
1841 dicom.ReplacePlainString(DicomTag(0x0008, 0x0013), "TM"); | |
1842 dicom.ReplacePlainString(DicomTag(0x0008, 0x0119), "UC"); | |
1843 dicom.ReplacePlainString(DicomTag(0x0008, 0x0016), "UI"); | |
1844 dicom.ReplacePlainString(DicomTag(0x0008, 0x1161), "128"); // UL | |
1845 dicom.ReplacePlainString(DicomTag(0x4342, 0x1234), "UN"); // Inexistent tag | |
1846 dicom.ReplacePlainString(DicomTag(0x0008, 0x0120), "UR"); | |
1847 dicom.ReplacePlainString(DicomTag(0x0008, 0x0301), "17"); // US | |
1848 dicom.ReplacePlainString(DicomTag(0x0040, 0x0031), "UT"); | |
1849 | |
1850 DicomWebJsonVisitor visitor; | |
1851 dicom.Apply(visitor); | |
1852 | |
1853 std::string s; | |
1854 | |
1855 // The tag (0002,0002) is "Media Storage SOP Class UID" and is | |
1856 // automatically copied by DCMTK from tag (0008,0016) | |
1857 ASSERT_EQ("UI", visitor.GetResult() ["00020002"]["vr"].asString()); | |
1858 ASSERT_EQ("UI", visitor.GetResult() ["00020002"]["Value"][0].asString()); | |
1859 ASSERT_EQ("AE", visitor.GetResult() ["00400241"]["vr"].asString()); | |
1860 ASSERT_EQ("AE", visitor.GetResult() ["00400241"]["Value"][0].asString()); | |
1861 ASSERT_EQ("AS", visitor.GetResult() ["00101010"]["vr"].asString()); | |
1862 ASSERT_EQ("AS", visitor.GetResult() ["00101010"]["Value"][0].asString()); | |
1863 ASSERT_EQ("AT", visitor.GetResult() ["00209165"]["vr"].asString()); | |
1864 ASSERT_EQ("00100020", visitor.GetResult() ["00209165"]["Value"][0].asString()); | |
1865 ASSERT_EQ("CS", visitor.GetResult() ["00080052"]["vr"].asString()); | |
1866 ASSERT_EQ("CS", visitor.GetResult() ["00080052"]["Value"][0].asString()); | |
1867 ASSERT_EQ("DA", visitor.GetResult() ["00080012"]["vr"].asString()); | |
1868 ASSERT_EQ("DA", visitor.GetResult() ["00080012"]["Value"][0].asString()); | |
1869 ASSERT_EQ("DS", visitor.GetResult() ["00101020"]["vr"].asString()); | |
1870 ASSERT_FLOAT_EQ(42.0f, visitor.GetResult() ["00101020"]["Value"][0].asFloat()); | |
1871 ASSERT_EQ("DT", visitor.GetResult() ["0008002A"]["vr"].asString()); | |
1872 ASSERT_EQ("DT", visitor.GetResult() ["0008002A"]["Value"][0].asString()); | |
1873 ASSERT_EQ("FL", visitor.GetResult() ["00109431"]["vr"].asString()); | |
1874 ASSERT_FLOAT_EQ(43.0f, visitor.GetResult() ["00109431"]["Value"][0].asFloat()); | |
1875 ASSERT_EQ("FD", visitor.GetResult() ["00081163"]["vr"].asString()); | |
1876 ASSERT_FLOAT_EQ(44.0f, visitor.GetResult() ["00081163"]["Value"][0].asFloat()); | |
1877 ASSERT_EQ("IS", visitor.GetResult() ["00081160"]["vr"].asString()); | |
1878 ASSERT_FLOAT_EQ(45.0f, visitor.GetResult() ["00081160"]["Value"][0].asFloat()); | |
1879 ASSERT_EQ("LO", visitor.GetResult() ["00080070"]["vr"].asString()); | |
1880 ASSERT_EQ("LO", visitor.GetResult() ["00080070"]["Value"][0].asString()); | |
1881 ASSERT_EQ("LT", visitor.GetResult() ["00104000"]["vr"].asString()); | |
1882 ASSERT_EQ("LT", visitor.GetResult() ["00104000"]["Value"][0].asString()); | |
1883 | |
1884 ASSERT_EQ("OB", visitor.GetResult() ["00282000"]["vr"].asString()); | |
1885 Toolbox::DecodeBase64(s, visitor.GetResult() ["00282000"]["InlineBinary"].asString()); | |
1886 ASSERT_EQ("OB", s); | |
1887 | |
1888 #if DCMTK_VERSION_NUMBER >= 361 | |
1889 ASSERT_EQ("OD", visitor.GetResult() ["7FE00009"]["vr"].asString()); | |
1890 ASSERT_FLOAT_EQ(3.14159f, boost::lexical_cast<float>(visitor.GetResult() ["7FE00009"]["Value"][0].asString())); | |
1891 #else | |
1892 ASSERT_EQ("UN", visitor.GetResult() ["7FE00009"]["vr"].asString()); | |
1893 Toolbox::DecodeBase64(s, visitor.GetResult() ["7FE00009"]["InlineBinary"].asString()); | |
1894 ASSERT_EQ(8u, s.size()); // Because of padding | |
1895 ASSERT_EQ(0, s[7]); | |
1896 ASSERT_EQ("3.14159", s.substr(0, 7)); | |
1897 #endif | |
1898 | |
1899 ASSERT_EQ("OF", visitor.GetResult() ["00640009"]["vr"].asString()); | |
1900 ASSERT_FLOAT_EQ(2.71828f, boost::lexical_cast<float>(visitor.GetResult() ["00640009"]["Value"][0].asString())); | |
1901 | |
1902 #if DCMTK_VERSION_NUMBER < 361 | |
1903 ASSERT_EQ("UN", visitor.GetResult() ["00660040"]["vr"].asString()); | |
1904 Toolbox::DecodeBase64(s, visitor.GetResult() ["00660040"]["InlineBinary"].asString()); | |
1905 ASSERT_EQ("46", s); | |
1906 #elif DCMTK_VERSION_NUMBER == 361 | |
1907 ASSERT_EQ("UL", visitor.GetResult() ["00660040"]["vr"].asString()); | |
1908 ASSERT_EQ(46, visitor.GetResult() ["00660040"]["Value"][0].asInt()); | |
1909 #else | |
1910 ASSERT_EQ("OL", visitor.GetResult() ["00660040"]["vr"].asString()); | |
1911 ASSERT_EQ(46, visitor.GetResult() ["00660040"]["Value"][0].asInt()); | |
1912 #endif | |
1913 | |
1914 ASSERT_EQ("OW", visitor.GetResult() ["00281201"]["vr"].asString()); | |
1915 Toolbox::DecodeBase64(s, visitor.GetResult() ["00281201"]["InlineBinary"].asString()); | |
1916 ASSERT_EQ("OWOW", s); | |
1917 | |
1918 ASSERT_EQ("PN", visitor.GetResult() ["00100010"]["vr"].asString()); | |
1919 ASSERT_EQ("PN", visitor.GetResult() ["00100010"]["Value"][0]["Alphabetic"].asString()); | |
1920 | |
1921 ASSERT_EQ("SH", visitor.GetResult() ["00080050"]["vr"].asString()); | |
1922 ASSERT_EQ("SH", visitor.GetResult() ["00080050"]["Value"][0].asString()); | |
1923 | |
1924 ASSERT_EQ("SL", visitor.GetResult() ["00186020"]["vr"].asString()); | |
1925 ASSERT_EQ(-15, visitor.GetResult() ["00186020"]["Value"][0].asInt()); | |
1926 | |
1927 ASSERT_EQ("SS", visitor.GetResult() ["00189219"]["vr"].asString()); | |
1928 ASSERT_EQ(-16, visitor.GetResult() ["00189219"]["Value"][0].asInt()); | |
1929 | |
1930 ASSERT_EQ("ST", visitor.GetResult() ["00080081"]["vr"].asString()); | |
1931 ASSERT_EQ("ST", visitor.GetResult() ["00080081"]["Value"][0].asString()); | |
1932 | |
1933 ASSERT_EQ("TM", visitor.GetResult() ["00080013"]["vr"].asString()); | |
1934 ASSERT_EQ("TM", visitor.GetResult() ["00080013"]["Value"][0].asString()); | |
1935 | |
1936 #if DCMTK_VERSION_NUMBER >= 361 | |
1937 ASSERT_EQ("UC", visitor.GetResult() ["00080119"]["vr"].asString()); | |
1938 ASSERT_EQ("UC", visitor.GetResult() ["00080119"]["Value"][0].asString()); | |
1939 #else | |
1940 ASSERT_EQ("UN", visitor.GetResult() ["00080119"]["vr"].asString()); | |
1941 Toolbox::DecodeBase64(s, visitor.GetResult() ["00080119"]["InlineBinary"].asString()); | |
1942 ASSERT_EQ("UC", s); | |
1943 #endif | |
1944 | |
1945 ASSERT_EQ("UI", visitor.GetResult() ["00080016"]["vr"].asString()); | |
1946 ASSERT_EQ("UI", visitor.GetResult() ["00080016"]["Value"][0].asString()); | |
1947 | |
1948 ASSERT_EQ("UL", visitor.GetResult() ["00081161"]["vr"].asString()); | |
1949 ASSERT_EQ(128u, visitor.GetResult() ["00081161"]["Value"][0].asUInt()); | |
1950 | |
1951 ASSERT_EQ("UN", visitor.GetResult() ["43421234"]["vr"].asString()); | |
1952 Toolbox::DecodeBase64(s, visitor.GetResult() ["43421234"]["InlineBinary"].asString()); | |
1953 ASSERT_EQ("UN", s); | |
1954 | |
1955 #if DCMTK_VERSION_NUMBER >= 361 | |
1956 ASSERT_EQ("UR", visitor.GetResult() ["00080120"]["vr"].asString()); | |
1957 ASSERT_EQ("UR", visitor.GetResult() ["00080120"]["Value"][0].asString()); | |
1958 #else | |
1959 ASSERT_EQ("UN", visitor.GetResult() ["00080120"]["vr"].asString()); | |
1960 Toolbox::DecodeBase64(s, visitor.GetResult() ["00080120"]["InlineBinary"].asString()); | |
1961 ASSERT_EQ("UR", s); | |
1962 #endif | |
1963 | |
1964 #if DCMTK_VERSION_NUMBER >= 361 | |
1965 ASSERT_EQ("US", visitor.GetResult() ["00080301"]["vr"].asString()); | |
1966 ASSERT_EQ(17u, visitor.GetResult() ["00080301"]["Value"][0].asUInt()); | |
1967 #else | |
1968 ASSERT_EQ("UN", visitor.GetResult() ["00080301"]["vr"].asString()); | |
1969 Toolbox::DecodeBase64(s, visitor.GetResult() ["00080301"]["InlineBinary"].asString()); | |
1970 ASSERT_EQ("17", s); | |
1971 #endif | |
1972 | |
1973 ASSERT_EQ("UT", visitor.GetResult() ["00400031"]["vr"].asString()); | |
1974 ASSERT_EQ("UT", visitor.GetResult() ["00400031"]["Value"][0].asString()); | |
1975 | |
1976 std::string xml; | |
1977 visitor.FormatXml(xml); | |
1978 | |
1979 { | |
1980 DicomMap m; | |
1981 m.FromDicomWeb(visitor.GetResult()); | |
1982 ASSERT_EQ(31u, m.GetSize()); | |
1983 | |
1984 std::string s; | |
1985 ASSERT_TRUE(m.LookupStringValue(s, DicomTag(0x0002, 0x0002), false)); ASSERT_EQ("UI", s); | |
1986 ASSERT_TRUE(m.LookupStringValue(s, DicomTag(0x0040, 0x0241), false)); ASSERT_EQ("AE", s); | |
1987 ASSERT_TRUE(m.LookupStringValue(s, DicomTag(0x0010, 0x1010), false)); ASSERT_EQ("AS", s); | |
1988 ASSERT_TRUE(m.LookupStringValue(s, DicomTag(0x0020, 0x9165), false)); ASSERT_EQ("00100020", s); | |
1989 ASSERT_TRUE(m.LookupStringValue(s, DicomTag(0x0008, 0x0052), false)); ASSERT_EQ("CS", s); | |
1990 ASSERT_TRUE(m.LookupStringValue(s, DicomTag(0x0008, 0x0012), false)); ASSERT_EQ("DA", s); | |
1991 ASSERT_TRUE(m.LookupStringValue(s, DicomTag(0x0010, 0x1020), false)); ASSERT_EQ("42", s); | |
1992 ASSERT_TRUE(m.LookupStringValue(s, DicomTag(0x0008, 0x002a), false)); ASSERT_EQ("DT", s); | |
1993 ASSERT_TRUE(m.LookupStringValue(s, DicomTag(0x0010, 0x9431), false)); ASSERT_EQ("43", s); | |
1994 ASSERT_TRUE(m.LookupStringValue(s, DicomTag(0x0008, 0x1163), false)); ASSERT_EQ("44", s); | |
1995 ASSERT_TRUE(m.LookupStringValue(s, DicomTag(0x0008, 0x1160), false)); ASSERT_EQ("45", s); | |
1996 ASSERT_TRUE(m.LookupStringValue(s, DicomTag(0x0008, 0x0070), false)); ASSERT_EQ("LO", s); | |
1997 ASSERT_TRUE(m.LookupStringValue(s, DicomTag(0x0010, 0x4000), false)); ASSERT_EQ("LT", s); | |
1998 ASSERT_TRUE(m.LookupStringValue(s, DicomTag(0x0028, 0x2000), true)); ASSERT_EQ("OB", s); | |
1999 ASSERT_TRUE(m.LookupStringValue(s, DicomTag(0x7fe0, 0x0009), true)); | |
2000 | |
2001 #if DCMTK_VERSION_NUMBER >= 361 | |
2002 ASSERT_FLOAT_EQ(3.14159f, boost::lexical_cast<float>(s)); | |
2003 #else | |
2004 ASSERT_EQ(8u, s.size()); // Because of padding | |
2005 ASSERT_EQ(0, s[7]); | |
2006 ASSERT_EQ("3.14159", s.substr(0, 7)); | |
2007 #endif | |
2008 | |
2009 ASSERT_TRUE(m.LookupStringValue(s, DicomTag(0x0064, 0x0009), true)); | |
2010 ASSERT_FLOAT_EQ(2.71828f, boost::lexical_cast<float>(s)); | |
2011 ASSERT_TRUE(m.LookupStringValue(s, DicomTag(0x0028, 0x1201), true)); ASSERT_EQ("OWOW", s); | |
2012 ASSERT_TRUE(m.LookupStringValue(s, DicomTag(0x0010, 0x0010), false)); ASSERT_EQ("PN", s); | |
2013 ASSERT_TRUE(m.LookupStringValue(s, DicomTag(0x0008, 0x0050), false)); ASSERT_EQ("SH", s); | |
2014 ASSERT_TRUE(m.LookupStringValue(s, DicomTag(0x0018, 0x6020), false)); ASSERT_EQ("-15", s); | |
2015 ASSERT_TRUE(m.LookupStringValue(s, DicomTag(0x0018, 0x9219), false)); ASSERT_EQ("-16", s); | |
2016 ASSERT_TRUE(m.LookupStringValue(s, DicomTag(0x0008, 0x0081), false)); ASSERT_EQ("ST", s); | |
2017 ASSERT_TRUE(m.LookupStringValue(s, DicomTag(0x0008, 0x0013), false)); ASSERT_EQ("TM", s); | |
2018 ASSERT_TRUE(m.LookupStringValue(s, DicomTag(0x0008, 0x0016), false)); ASSERT_EQ("UI", s); | |
2019 ASSERT_TRUE(m.LookupStringValue(s, DicomTag(0x0008, 0x1161), false)); ASSERT_EQ("128", s); | |
2020 ASSERT_TRUE(m.LookupStringValue(s, DicomTag(0x4342, 0x1234), true)); ASSERT_EQ("UN", s); | |
2021 ASSERT_TRUE(m.LookupStringValue(s, DicomTag(0x0040, 0x0031), false)); ASSERT_EQ("UT", s); | |
2022 | |
2023 #if DCMTK_VERSION_NUMBER >= 361 | |
2024 ASSERT_TRUE(m.LookupStringValue(s, DicomTag(0x0066, 0x0040), false)); ASSERT_EQ("46", s); | |
2025 ASSERT_TRUE(m.LookupStringValue(s, DicomTag(0x0008, 0x0119), false)); ASSERT_EQ("UC", s); | |
2026 ASSERT_TRUE(m.LookupStringValue(s, DicomTag(0x0008, 0x0120), false)); ASSERT_EQ("UR", s); | |
2027 ASSERT_TRUE(m.LookupStringValue(s, DicomTag(0x0008, 0x0301), false)); ASSERT_EQ("17", s); | |
2028 #else | |
2029 ASSERT_TRUE(m.LookupStringValue(s, DicomTag(0x0066, 0x0040), true)); ASSERT_EQ("46", s); // OL | |
2030 ASSERT_TRUE(m.LookupStringValue(s, DicomTag(0x0008, 0x0119), true)); ASSERT_EQ("UC", s); | |
2031 ASSERT_TRUE(m.LookupStringValue(s, DicomTag(0x0008, 0x0120), true)); ASSERT_EQ("UR", s); | |
2032 ASSERT_TRUE(m.LookupStringValue(s, DicomTag(0x0008, 0x0301), true)); ASSERT_EQ("17", s); // US (but tag unknown to DCMTK 3.6.0) | |
2033 #endif | |
2034 | |
2035 } | |
2036 } | |
2037 | |
2038 | |
2039 TEST(DicomWebJson, Sequence) | |
2040 { | |
2041 ParsedDicomFile dicom(false); | |
2042 | |
2043 { | |
2044 std::unique_ptr<DcmSequenceOfItems> sequence(new DcmSequenceOfItems(DCM_ReferencedSeriesSequence)); | |
2045 | |
2046 for (unsigned int i = 0; i < 3; i++) | |
2047 { | |
2048 std::unique_ptr<DcmItem> item(new DcmItem); | |
2049 std::string s = "item" + boost::lexical_cast<std::string>(i); | |
2050 item->putAndInsertString(DCM_ReferencedSOPInstanceUID, s.c_str(), OFFalse); | |
2051 ASSERT_TRUE(sequence->insert(item.release(), false, false).good()); | |
2052 } | |
2053 | |
2054 ASSERT_TRUE(dicom.GetDcmtkObject().getDataset()->insert(sequence.release(), false, false).good()); | |
2055 } | |
2056 | |
2057 DicomWebJsonVisitor visitor; | |
2058 dicom.Apply(visitor); | |
2059 | |
2060 ASSERT_EQ("SQ", visitor.GetResult() ["00081115"]["vr"].asString()); | |
2061 ASSERT_EQ(3u, visitor.GetResult() ["00081115"]["Value"].size()); | |
2062 | |
2063 std::set<std::string> items; | |
2064 | |
2065 for (Json::Value::ArrayIndex i = 0; i < 3; i++) | |
2066 { | |
2067 ASSERT_EQ(1u, visitor.GetResult() ["00081115"]["Value"][i].size()); | |
2068 ASSERT_EQ(1u, visitor.GetResult() ["00081115"]["Value"][i]["00081155"]["Value"].size()); | |
2069 ASSERT_EQ("UI", visitor.GetResult() ["00081115"]["Value"][i]["00081155"]["vr"].asString()); | |
2070 items.insert(visitor.GetResult() ["00081115"]["Value"][i]["00081155"]["Value"][0].asString()); | |
2071 } | |
2072 | |
2073 ASSERT_EQ(3u, items.size()); | |
2074 ASSERT_TRUE(items.find("item0") != items.end()); | |
2075 ASSERT_TRUE(items.find("item1") != items.end()); | |
2076 ASSERT_TRUE(items.find("item2") != items.end()); | |
2077 | |
2078 std::string xml; | |
2079 visitor.FormatXml(xml); | |
2080 | |
2081 { | |
2082 DicomMap m; | |
2083 m.FromDicomWeb(visitor.GetResult()); | |
2084 ASSERT_EQ(0u, m.GetSize()); // Sequences are not handled by DicomMap | |
2085 } | |
2086 } | |
2087 | |
2088 | |
1779 | 2089 |
1780 | 2090 |
1781 #if ORTHANC_ENABLE_DCMTK_TRANSCODING == 1 | 2091 #if ORTHANC_ENABLE_DCMTK_TRANSCODING == 1 |
1782 | 2092 |
1783 #include "../Sources/DicomNetworking/DicomStoreUserConnection.h" | 2093 #include "../Sources/DicomNetworking/DicomStoreUserConnection.h" |