1 /* test-tagtable.c
2 *
3 * Test various functions that involve the tag table.
4 *
5 * Copyright (c) 2009 Dan Fandrich <dan@coneharvesters.com>
6 *
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2 of the License, or (at your option) any later version.
11 *
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the
19 * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
20 * Boston, MA 02110-1301 USA.
21 *
22 * SPDX-License-Identifier: LGPL-2.0-or-later
23 */
24
25 #include "config.h"
26 #include <libexif/exif-tag.h>
27 #include <stdio.h>
28 #include <string.h>
29
30 #define VALIDATE(s) if (!(s)) {printf("Test %s FAILED\n", #s); fail=1;}
31
32 #define TESTBLOCK(t) {int rc = (t); fail |= rc; \
33 if (rc) printf("%s tests FAILED\n", #t);}
34
35 /* Test exif_tag_get_support_level_in_ifd */
support_level(void)36 static int support_level(void)
37 {
38 int fail = 0;
39
40 /*
41 * The tag EXIF_TAG_PLANAR_CONFIGURATION support varies greatly between
42 * data types.
43 */
44 VALIDATE(exif_tag_get_support_level_in_ifd(EXIF_TAG_PLANAR_CONFIGURATION,
45 EXIF_IFD_0, EXIF_DATA_TYPE_UNCOMPRESSED_CHUNKY) ==
46 EXIF_SUPPORT_LEVEL_OPTIONAL)
47
48 VALIDATE(exif_tag_get_support_level_in_ifd(EXIF_TAG_PLANAR_CONFIGURATION,
49 EXIF_IFD_0, EXIF_DATA_TYPE_UNCOMPRESSED_PLANAR) ==
50 EXIF_SUPPORT_LEVEL_MANDATORY)
51
52 VALIDATE(exif_tag_get_support_level_in_ifd(EXIF_TAG_PLANAR_CONFIGURATION,
53 EXIF_IFD_0, EXIF_DATA_TYPE_UNCOMPRESSED_YCC) ==
54 EXIF_SUPPORT_LEVEL_OPTIONAL)
55
56 VALIDATE(exif_tag_get_support_level_in_ifd(EXIF_TAG_PLANAR_CONFIGURATION,
57 EXIF_IFD_0, EXIF_DATA_TYPE_COMPRESSED) ==
58 EXIF_SUPPORT_LEVEL_NOT_RECORDED)
59
60 VALIDATE(exif_tag_get_support_level_in_ifd(EXIF_TAG_PLANAR_CONFIGURATION,
61 EXIF_IFD_0, EXIF_DATA_TYPE_UNKNOWN) ==
62 EXIF_SUPPORT_LEVEL_UNKNOWN)
63
64 /*
65 * The tag EXIF_TAG_YCBCR_POSITIONING support varies greatly between
66 * IFDs
67 */
68 VALIDATE(exif_tag_get_support_level_in_ifd(EXIF_TAG_YCBCR_POSITIONING,
69 EXIF_IFD_0, EXIF_DATA_TYPE_COMPRESSED) ==
70 EXIF_SUPPORT_LEVEL_MANDATORY)
71
72 VALIDATE(exif_tag_get_support_level_in_ifd(EXIF_TAG_YCBCR_POSITIONING,
73 EXIF_IFD_1, EXIF_DATA_TYPE_COMPRESSED) ==
74 EXIF_SUPPORT_LEVEL_OPTIONAL)
75
76 VALIDATE(exif_tag_get_support_level_in_ifd(EXIF_TAG_YCBCR_POSITIONING,
77 EXIF_IFD_EXIF, EXIF_DATA_TYPE_COMPRESSED) ==
78 EXIF_SUPPORT_LEVEL_NOT_RECORDED)
79
80 VALIDATE(exif_tag_get_support_level_in_ifd(EXIF_TAG_YCBCR_POSITIONING,
81 EXIF_IFD_GPS, EXIF_DATA_TYPE_COMPRESSED) ==
82 EXIF_SUPPORT_LEVEL_NOT_RECORDED)
83
84 VALIDATE(exif_tag_get_support_level_in_ifd(EXIF_TAG_YCBCR_POSITIONING,
85 EXIF_IFD_INTEROPERABILITY, EXIF_DATA_TYPE_COMPRESSED) ==
86 EXIF_SUPPORT_LEVEL_NOT_RECORDED)
87
88
89 /*
90 * The tag EXIF_TAG_GPS_VERSION_ID has value 0 which should NOT be
91 * treated specially
92 */
93 VALIDATE(exif_tag_get_support_level_in_ifd(EXIF_TAG_GPS_VERSION_ID,
94 EXIF_IFD_GPS, EXIF_DATA_TYPE_COMPRESSED) ==
95 EXIF_SUPPORT_LEVEL_OPTIONAL)
96
97 VALIDATE(exif_tag_get_support_level_in_ifd(EXIF_TAG_GPS_VERSION_ID,
98 EXIF_IFD_GPS, EXIF_DATA_TYPE_UNKNOWN) ==
99 EXIF_SUPPORT_LEVEL_OPTIONAL)
100
101 VALIDATE(exif_tag_get_support_level_in_ifd(EXIF_TAG_GPS_VERSION_ID,
102 EXIF_IFD_0, EXIF_DATA_TYPE_COMPRESSED) ==
103 EXIF_SUPPORT_LEVEL_NOT_RECORDED)
104
105 VALIDATE(exif_tag_get_support_level_in_ifd(EXIF_TAG_GPS_VERSION_ID,
106 EXIF_IFD_0, EXIF_DATA_TYPE_UNKNOWN) ==
107 EXIF_SUPPORT_LEVEL_UNKNOWN)
108
109 /* The unused tag 0xffff should NOT be treated specially */
110 VALIDATE(exif_tag_get_support_level_in_ifd(0xffff,
111 EXIF_IFD_0, EXIF_DATA_TYPE_UNKNOWN) ==
112 EXIF_SUPPORT_LEVEL_UNKNOWN)
113
114 VALIDATE(exif_tag_get_support_level_in_ifd(0xffff,
115 EXIF_IFD_0, EXIF_DATA_TYPE_COMPRESSED) ==
116 EXIF_SUPPORT_LEVEL_NOT_RECORDED)
117
118 /*
119 * The tag EXIF_TAG_DOCUMENT_NAME isn't in the EXIF 2.2 standard but
120 * it exists in the tag table, which causes it to show up as unknown
121 * instead of not recorded.
122 */
123 VALIDATE(exif_tag_get_support_level_in_ifd(EXIF_TAG_DOCUMENT_NAME,
124 EXIF_IFD_0, EXIF_DATA_TYPE_UNKNOWN) ==
125 EXIF_SUPPORT_LEVEL_UNKNOWN)
126
127 VALIDATE(exif_tag_get_support_level_in_ifd(EXIF_TAG_DOCUMENT_NAME,
128 EXIF_IFD_1, EXIF_DATA_TYPE_UNCOMPRESSED_CHUNKY) ==
129 EXIF_SUPPORT_LEVEL_UNKNOWN)
130
131
132 /*
133 * The tag number for EXIF_TAG_INTEROPERABILITY_INDEX (1) exists in both
134 * IFD Interoperability and IFD GPS (as EXIF_TAG_GPS_LATITUDE_REF) so
135 * there are two entries in the table.
136 */
137 VALIDATE(exif_tag_get_support_level_in_ifd(EXIF_TAG_INTEROPERABILITY_INDEX,
138 EXIF_IFD_INTEROPERABILITY, EXIF_DATA_TYPE_COMPRESSED) ==
139 EXIF_SUPPORT_LEVEL_OPTIONAL)
140
141 VALIDATE(exif_tag_get_support_level_in_ifd(EXIF_TAG_INTEROPERABILITY_INDEX,
142 EXIF_IFD_INTEROPERABILITY, EXIF_DATA_TYPE_UNKNOWN) ==
143 EXIF_SUPPORT_LEVEL_OPTIONAL)
144
145 VALIDATE(exif_tag_get_support_level_in_ifd(EXIF_TAG_INTEROPERABILITY_INDEX,
146 EXIF_IFD_0, EXIF_DATA_TYPE_COMPRESSED) ==
147 EXIF_SUPPORT_LEVEL_NOT_RECORDED)
148
149 VALIDATE(exif_tag_get_support_level_in_ifd(EXIF_TAG_INTEROPERABILITY_INDEX,
150 EXIF_IFD_0, EXIF_DATA_TYPE_UNKNOWN) ==
151 EXIF_SUPPORT_LEVEL_UNKNOWN)
152
153 VALIDATE(exif_tag_get_support_level_in_ifd(EXIF_TAG_GPS_LATITUDE_REF,
154 EXIF_IFD_GPS, EXIF_DATA_TYPE_COMPRESSED) ==
155 EXIF_SUPPORT_LEVEL_OPTIONAL)
156
157 VALIDATE(exif_tag_get_support_level_in_ifd(EXIF_TAG_GPS_LATITUDE_REF,
158 EXIF_IFD_GPS, EXIF_DATA_TYPE_UNKNOWN) ==
159 EXIF_SUPPORT_LEVEL_OPTIONAL)
160
161 /* The result of an unknown IFD should always be unknown */
162 VALIDATE(exif_tag_get_support_level_in_ifd(EXIF_TAG_EXIF_VERSION,
163 EXIF_IFD_COUNT, EXIF_DATA_TYPE_UNKNOWN) ==
164 EXIF_SUPPORT_LEVEL_UNKNOWN)
165
166 VALIDATE(exif_tag_get_support_level_in_ifd(EXIF_TAG_EXIF_VERSION,
167 EXIF_IFD_COUNT, EXIF_DATA_TYPE_COMPRESSED) ==
168 EXIF_SUPPORT_LEVEL_UNKNOWN)
169
170 return fail;
171 }
172
173 /* Test exif_tag_get_name_in_ifd */
name(void)174 static int name(void)
175 {
176 int fail = 0;
177
178 /*
179 * The tag EXIF_TAG_GPS_VERSION_ID has value 0 which should NOT be
180 * treated specially
181 */
182 VALIDATE(!strcmp(exif_tag_get_name_in_ifd(
183 EXIF_TAG_GPS_VERSION_ID, EXIF_IFD_GPS),
184 "GPSVersionID"))
185
186 VALIDATE(exif_tag_get_name_in_ifd(
187 EXIF_TAG_GPS_VERSION_ID, EXIF_IFD_0) == NULL)
188
189 /*
190 * The tag number for EXIF_TAG_INTEROPERABILITY_INDEX (1) exists in both
191 * IFD Interoperability and IFD GPS (as EXIF_TAG_GPS_LATITUDE_REF) so
192 * there are two entries in the table.
193 */
194 VALIDATE(!strcmp(exif_tag_get_name_in_ifd(
195 EXIF_TAG_INTEROPERABILITY_INDEX, EXIF_IFD_INTEROPERABILITY),
196 "InteroperabilityIndex"))
197
198 VALIDATE(!strcmp(exif_tag_get_name_in_ifd(
199 EXIF_TAG_GPS_LATITUDE_REF, EXIF_IFD_GPS),
200 "GPSLatitudeRef"))
201
202 /* Tag that doesn't appear in an IFD produces a NULL */
203 VALIDATE(exif_tag_get_name_in_ifd(
204 EXIF_TAG_EXIF_VERSION, EXIF_IFD_0) == NULL)
205
206 /* Invalid IFD produces a NULL */
207 VALIDATE(exif_tag_get_name_in_ifd(
208 EXIF_TAG_EXIF_VERSION, EXIF_IFD_COUNT) == NULL)
209
210 return fail;
211 }
212
213 int
main(void)214 main (void)
215 {
216 int fail = 0;
217
218 TESTBLOCK(support_level())
219 TESTBLOCK(name())
220
221 return fail;
222 }
223