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