• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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