From 934ebeb47cf5c4164f34c8ce7c9bace832a26894 Mon Sep 17 00:00:00 2001 From: Dan Fandrich Date: Thu, 22 Jan 2009 16:12:27 -0800 Subject: [PATCH] Added test-tagtable to do some tests on the static EXIF tag information table. --- ChangeLog | 7 ++ test/Makefile.am | 7 +- test/test-tagtable.c | 220 +++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 232 insertions(+), 2 deletions(-) create mode 100644 test/test-tagtable.c diff --git a/ChangeLog b/ChangeLog index 3a593fb..a13e4fe 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2009-01-22 Dan Fandrich + + * Fix exif_tag_get_support_level_in_ifd() to handle the case where two + tags with the same number exist in different IFDs. + * Added test-tagtable to do some tests on the static EXIF tag + information table. + 2009-01-21 Dan Fandrich * libexif/exif-entry.c: Initialize the default for EXIF_TAG_COLOR_SPACE diff --git a/test/Makefile.am b/test/Makefile.am index 1c63bfe..8aeef46 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -10,12 +10,13 @@ SUBDIRS = nls # And this is just the lib - we don't have the program available # here yet. -TESTS = test-mem test-value test-integers test-parse +TESTS = test-mem test-value test-integers test-parse test-tagtable TEST_IMAGES = $(top_srcdir)/daniel-andrews-sample.jpg export TEST_IMAGES -check_PROGRAMS = test-mem test-mnote test-value test-integers test-parse +check_PROGRAMS = test-mem test-mnote test-value test-integers test-parse \ + test-tagtable test_mem_LDADD = $(top_builddir)/libexif/libexif.la $(LTLIBINTL) @@ -24,3 +25,5 @@ test_mnote_LDADD = $(top_builddir)/libexif/libexif.la $(LTLIBINTL) test_value_LDADD = $(top_builddir)/libexif/libexif.la $(LTLIBINTL) test_parse_LDADD = $(top_builddir)/libexif/libexif.la $(LTLIBINTL) + +test_tagtable_LDADD = $(top_builddir)/libexif/libexif.la $(LTLIBINTL) diff --git a/test/test-tagtable.c b/test/test-tagtable.c new file mode 100644 index 0000000..0e819f9 --- /dev/null +++ b/test/test-tagtable.c @@ -0,0 +1,220 @@ +/* test-tagtable.c + * + * Test various functions that involve the tag table. + * + * Copyright © 2009 Dan Fandrich + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include "config.h" +#include +#include +#include + +#define VALIDATE(s) if (!(s)) {printf("Test %s FAILED\n", #s); fail=1;} + +#define TESTBLOCK(t) {int rc = (t); fail |= rc; \ + if (rc) printf("%s tests FAILED\n", #t);} + +/* Test exif_tag_get_support_level_in_ifd */ +static int support_level(void) +{ + int fail = 0; + + /* + * The tag EXIF_TAG_PLANAR_CONFIGURATION support varies greatly between + * data types. + */ + VALIDATE(exif_tag_get_support_level_in_ifd(EXIF_TAG_PLANAR_CONFIGURATION, + EXIF_IFD_0, EXIF_DATA_TYPE_UNCOMPRESSED_CHUNKY) == + EXIF_SUPPORT_LEVEL_OPTIONAL) + + VALIDATE(exif_tag_get_support_level_in_ifd(EXIF_TAG_PLANAR_CONFIGURATION, + EXIF_IFD_0, EXIF_DATA_TYPE_UNCOMPRESSED_PLANAR) == + EXIF_SUPPORT_LEVEL_MANDATORY) + + VALIDATE(exif_tag_get_support_level_in_ifd(EXIF_TAG_PLANAR_CONFIGURATION, + EXIF_IFD_0, EXIF_DATA_TYPE_UNCOMPRESSED_YCC) == + EXIF_SUPPORT_LEVEL_OPTIONAL) + + VALIDATE(exif_tag_get_support_level_in_ifd(EXIF_TAG_PLANAR_CONFIGURATION, + EXIF_IFD_0, EXIF_DATA_TYPE_COMPRESSED) == + EXIF_SUPPORT_LEVEL_NOT_RECORDED) + + VALIDATE(exif_tag_get_support_level_in_ifd(EXIF_TAG_PLANAR_CONFIGURATION, + EXIF_IFD_0, EXIF_DATA_TYPE_COUNT) == + EXIF_SUPPORT_LEVEL_UNKNOWN) + + /* + * The tag EXIF_TAG_YCBCR_POSITIONING support varies greatly between + * IFDs + */ + VALIDATE(exif_tag_get_support_level_in_ifd(EXIF_TAG_YCBCR_POSITIONING, + EXIF_IFD_0, EXIF_DATA_TYPE_COMPRESSED) == + EXIF_SUPPORT_LEVEL_MANDATORY) + + VALIDATE(exif_tag_get_support_level_in_ifd(EXIF_TAG_YCBCR_POSITIONING, + EXIF_IFD_1, EXIF_DATA_TYPE_COMPRESSED) == + EXIF_SUPPORT_LEVEL_OPTIONAL) + + VALIDATE(exif_tag_get_support_level_in_ifd(EXIF_TAG_YCBCR_POSITIONING, + EXIF_IFD_EXIF, EXIF_DATA_TYPE_COMPRESSED) == + EXIF_SUPPORT_LEVEL_NOT_RECORDED) + + VALIDATE(exif_tag_get_support_level_in_ifd(EXIF_TAG_YCBCR_POSITIONING, + EXIF_IFD_GPS, EXIF_DATA_TYPE_COMPRESSED) == + EXIF_SUPPORT_LEVEL_NOT_RECORDED) + + VALIDATE(exif_tag_get_support_level_in_ifd(EXIF_TAG_YCBCR_POSITIONING, + EXIF_IFD_INTEROPERABILITY, EXIF_DATA_TYPE_COMPRESSED) == + EXIF_SUPPORT_LEVEL_NOT_RECORDED) + + + /* + * The tag EXIF_TAG_GPS_VERSION_ID has value 0 which should NOT be + * treated specially + */ + VALIDATE(exif_tag_get_support_level_in_ifd(EXIF_TAG_GPS_VERSION_ID, + EXIF_IFD_GPS, EXIF_DATA_TYPE_COMPRESSED) == + EXIF_SUPPORT_LEVEL_OPTIONAL) + + VALIDATE(exif_tag_get_support_level_in_ifd(EXIF_TAG_GPS_VERSION_ID, + EXIF_IFD_GPS, EXIF_DATA_TYPE_COUNT) == + EXIF_SUPPORT_LEVEL_OPTIONAL) + + VALIDATE(exif_tag_get_support_level_in_ifd(EXIF_TAG_GPS_VERSION_ID, + EXIF_IFD_0, EXIF_DATA_TYPE_COMPRESSED) == + EXIF_SUPPORT_LEVEL_NOT_RECORDED) + + VALIDATE(exif_tag_get_support_level_in_ifd(EXIF_TAG_GPS_VERSION_ID, + EXIF_IFD_0, EXIF_DATA_TYPE_COUNT) == + EXIF_SUPPORT_LEVEL_UNKNOWN) + + /* The unused tag 0xffff should NOT be treated specially */ + VALIDATE(exif_tag_get_support_level_in_ifd(0xffff, + EXIF_IFD_0, EXIF_DATA_TYPE_COUNT) == + EXIF_SUPPORT_LEVEL_UNKNOWN) + + VALIDATE(exif_tag_get_support_level_in_ifd(0xffff, + EXIF_IFD_0, EXIF_DATA_TYPE_COMPRESSED) == + EXIF_SUPPORT_LEVEL_NOT_RECORDED) + + /* + * The tag EXIF_TAG_DOCUMENT_NAME isn't in the EXIF 2.2 standard but + * it exists in the tag table, which causes it to show up as unknown + * instead of not recorded. + */ + VALIDATE(exif_tag_get_support_level_in_ifd(EXIF_TAG_DOCUMENT_NAME, + EXIF_IFD_0, EXIF_DATA_TYPE_COUNT) == + EXIF_SUPPORT_LEVEL_UNKNOWN) + + VALIDATE(exif_tag_get_support_level_in_ifd(EXIF_TAG_DOCUMENT_NAME, + EXIF_IFD_1, EXIF_DATA_TYPE_UNCOMPRESSED_CHUNKY) == + EXIF_SUPPORT_LEVEL_UNKNOWN) + + + /* + * The tag number for EXIF_TAG_INTEROPERABILITY_INDEX (1) exists in both + * IFD Interoperability and IFD GPS (as EXIF_TAG_GPS_LATITUDE_REF) so + * there are two entries in the table. + */ + VALIDATE(exif_tag_get_support_level_in_ifd(EXIF_TAG_INTEROPERABILITY_INDEX, + EXIF_IFD_INTEROPERABILITY, EXIF_DATA_TYPE_COMPRESSED) == + EXIF_SUPPORT_LEVEL_OPTIONAL) + + VALIDATE(exif_tag_get_support_level_in_ifd(EXIF_TAG_INTEROPERABILITY_INDEX, + EXIF_IFD_INTEROPERABILITY, EXIF_DATA_TYPE_COUNT) == + EXIF_SUPPORT_LEVEL_OPTIONAL) + + VALIDATE(exif_tag_get_support_level_in_ifd(EXIF_TAG_INTEROPERABILITY_INDEX, + EXIF_IFD_0, EXIF_DATA_TYPE_COMPRESSED) == + EXIF_SUPPORT_LEVEL_NOT_RECORDED) + + VALIDATE(exif_tag_get_support_level_in_ifd(EXIF_TAG_INTEROPERABILITY_INDEX, + EXIF_IFD_0, EXIF_DATA_TYPE_COUNT) == + EXIF_SUPPORT_LEVEL_UNKNOWN) + + VALIDATE(exif_tag_get_support_level_in_ifd(EXIF_TAG_GPS_LATITUDE_REF, + EXIF_IFD_GPS, EXIF_DATA_TYPE_COMPRESSED) == + EXIF_SUPPORT_LEVEL_OPTIONAL) + + VALIDATE(exif_tag_get_support_level_in_ifd(EXIF_TAG_GPS_LATITUDE_REF, + EXIF_IFD_GPS, EXIF_DATA_TYPE_COUNT) == + EXIF_SUPPORT_LEVEL_OPTIONAL) + + /* The result of an unknown IFD should always be unknown */ + VALIDATE(exif_tag_get_support_level_in_ifd(EXIF_TAG_EXIF_VERSION, + EXIF_IFD_COUNT, EXIF_DATA_TYPE_COUNT) == + EXIF_SUPPORT_LEVEL_UNKNOWN) + + VALIDATE(exif_tag_get_support_level_in_ifd(EXIF_TAG_EXIF_VERSION, + EXIF_IFD_COUNT, EXIF_DATA_TYPE_COMPRESSED) == + EXIF_SUPPORT_LEVEL_UNKNOWN) + + return fail; +} + +/* Test exif_tag_get_name_in_ifd */ +static int name(void) +{ + int fail = 0; + + /* + * The tag EXIF_TAG_GPS_VERSION_ID has value 0 which should NOT be + * treated specially + */ + VALIDATE(!strcmp(exif_tag_get_name_in_ifd( + EXIF_TAG_GPS_VERSION_ID, EXIF_IFD_GPS), + "GPSVersionID")) + + VALIDATE(exif_tag_get_name_in_ifd( + EXIF_TAG_GPS_VERSION_ID, EXIF_IFD_0) == NULL) + + /* + * The tag number for EXIF_TAG_INTEROPERABILITY_INDEX (1) exists in both + * IFD Interoperability and IFD GPS (as EXIF_TAG_GPS_LATITUDE_REF) so + * there are two entries in the table. + */ + VALIDATE(!strcmp(exif_tag_get_name_in_ifd( + EXIF_TAG_INTEROPERABILITY_INDEX, EXIF_IFD_INTEROPERABILITY), + "InteroperabilityIndex")) + + VALIDATE(!strcmp(exif_tag_get_name_in_ifd( + EXIF_TAG_GPS_LATITUDE_REF, EXIF_IFD_GPS), + "GPSLatitudeRef")) + + /* Tag that doesn't appear in an IFD produces a NULL */ + VALIDATE(exif_tag_get_name_in_ifd( + EXIF_TAG_EXIF_VERSION, EXIF_IFD_0) == NULL) + + /* Invalid IFD produces a NULL */ + VALIDATE(exif_tag_get_name_in_ifd( + EXIF_TAG_EXIF_VERSION, EXIF_IFD_COUNT) == NULL) + + return fail; +} + +int +main () +{ + int fail = 0; + + TESTBLOCK(support_level()) + TESTBLOCK(name()) + + return fail; +} -- 2.7.4