1 /*
2 *
3 * Copyright (C) 2011-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: dcmdata
15 *
16 * Author: Uli Schlachter
17 *
18 * Purpose: test program for the data dictionary
19 *
20 */
21
22
23 #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */
24
25 #include "dcmtk/ofstd/oftest.h"
26 #include "dcmtk/dcmdata/dcdict.h"
27 #include "dcmtk/dcmdata/dctagkey.h"
28 #include "dcmtk/dcmdata/dcvr.h"
29 #include "dcmtk/dcmdata/dcdicent.h"
30
OFTEST(dcmdata_readingDataDictionary)31 OFTEST(dcmdata_readingDataDictionary)
32 {
33 // Does loading the global data dictionary work?
34 if (!dcmDataDict.isDictionaryLoaded())
35 OFCHECK_FAIL("no data dictionary loaded, check environment variable: " DCM_DICT_ENVIRONMENT_VARIABLE);
36 }
37
OFTEST(dcmdata_usingDataDictionary)38 OFTEST(dcmdata_usingDataDictionary)
39 {
40 // All tests run with an DCMDICTPATH external dictionary defined. This test
41 // expects an empty dictionary though, so we disable the DCMDICTPATH
42 // dictionary in this test by unsetting the environment variable.
43 #ifdef _WIN32
44 _putenv_s("DCMDICTPATH", "");
45 #else
46 setenv("DCMDICTPATH","", 1 /* overwrite */);
47 #endif
48
49 // This dictionary will only contain the skeleton entries
50 DcmDataDictionary localDict(OFFalse, OFFalse);
51 DcmDictEntry *entry1;
52 DcmDictEntry *entry2;
53 const char *name = "TestEntry";
54 const char *creator = "Test";
55 DcmTagKey key1(2, 2);
56 DcmTagKey key2(4, 5);
57 int entries;
58
59 #define checkDictionary(num_entries, e_name, key1_c, key2_c, key1_nc, key2_nc) \
60 entries = localDict.numberOfNormalTagEntries(); \
61 entries += localDict.numberOfRepeatingTagEntries(); \
62 OFCHECK_EQUAL(localDict.numberOfSkeletonEntries() + num_entries, entries); \
63 OFCHECK_EQUAL(localDict.numberOfEntries(), num_entries); \
64 OFCHECK(!localDict.isDictionaryLoaded()); \
65 OFCHECK(localDict.findEntry("UnexistingEntry") == NULL); \
66 OFCHECK(localDict.findEntry(name) == e_name); \
67 OFCHECK(localDict.findEntry(key1, creator) == key1_c); \
68 OFCHECK(localDict.findEntry(key2, creator) == key2_c); \
69 OFCHECK(localDict.findEntry(key1, NULL) == key1_nc); \
70 OFCHECK(localDict.findEntry(key2, NULL) == key2_nc);
71
72 checkDictionary(0, NULL, NULL, NULL, NULL, NULL);
73
74 entry1 = new DcmDictEntry(2, 2, DcmVR(EVR_PN), name, 0, 1,
75 "test", OFTrue, "Test");
76 entry2 = new DcmDictEntry(4, 4, 4, 6, DcmVR(EVR_PN), name, 0, 1,
77 "test", OFTrue, "Test");
78 localDict.addEntry(entry1);
79 localDict.addEntry(entry2);
80
81 checkDictionary(2, entry1, entry1, entry2, NULL, NULL);
82
83 // This also gets rid of the skeleton entries!
84 localDict.clear();
85
86 OFCHECK_EQUAL(localDict.numberOfNormalTagEntries(), 0);
87 OFCHECK_EQUAL(localDict.numberOfRepeatingTagEntries(), 0);
88 OFCHECK_EQUAL(localDict.numberOfSkeletonEntries(), 0);
89 OFCHECK_EQUAL(localDict.numberOfEntries(), 0);
90
91 checkDictionary(0, NULL, NULL, NULL, NULL, NULL);
92
93 // Load the skeleton dictionary again
94 OFCHECK(localDict.reloadDictionaries(OFFalse, OFFalse));
95
96 checkDictionary(0, NULL, NULL, NULL, NULL, NULL);
97
98 entry1 = new DcmDictEntry(2, 2, DcmVR(EVR_PN), name, 0, 1,
99 "test", OFTrue, NULL);
100 entry2 = new DcmDictEntry(4, 4, 4, 6, DcmVR(EVR_PN), name, 0, 1,
101 "test", OFTrue, NULL);
102 localDict.addEntry(entry1);
103 localDict.addEntry(entry2);
104
105 checkDictionary(2, entry1, NULL, NULL, entry1, entry2);
106
107 // Now we will overwrite entries
108 entry1 = new DcmDictEntry(2, 2, DcmVR(EVR_PN), "overwritten", 0, 1,
109 "test", OFTrue, NULL);
110 entry2 = new DcmDictEntry(4, 4, 4, 6, DcmVR(EVR_PN), "overwritten", 0, 1,
111 "test", OFTrue, NULL);
112 localDict.addEntry(entry1);
113 localDict.addEntry(entry2);
114
115 checkDictionary(2, NULL, NULL, NULL, entry1, entry2);
116
117 #undef checkDictionary
118 }
119