From 830abfced87aefae3f574170a9948dcdc5d4bef2 Mon Sep 17 00:00:00 2001 From: David Shea Date: Fri, 24 Jun 2016 14:26:13 -0400 Subject: [PATCH 10/24] Add a new test to check whether all zones can be selected. Since the answer is "no", add some additional city data to provide locations for currently unclickable zones. --- configure.ac | 3 + src/Makefile.am | 22 +++++-- src/data/README | 5 ++ src/data/citiesExtra.txt | 5 ++ src/test-clickability.c | 150 +++++++++++++++++++++++++++++++++++++++++++++++ src/tz.h | 2 +- 7 files changed, 186 insertions(+), 5 deletions(-) create mode 100644 src/data/citiesExtra.txt create mode 100644 src/test-clickability.c diff --git a/configure.ac b/configure.ac index 7e647f0..31f8ffa 100644 --- a/configure.ac +++ b/configure.ac @@ -61,6 +61,9 @@ PKG_CHECK_MODULES(LIBTIMEZONEMAP, gio-2.0 >= $GIO_REQUIRED_VERSION librsvg-2.0) LIBTIMEZONEMAP_LIBS="$LIBTIMEZONEMAP_LIBS $LIBM" +# Extra requirements for tests +PKG_CHECK_MODULES(LIBXML, libxml-2.0) + GOBJECT_INTROSPECTION_CHECK([0.6.7]) ########################### diff --git a/src/Makefile.am b/src/Makefile.am index 106f034..56e404a 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -5,10 +5,19 @@ dist_ui_DATA = \ data/olsen_map.png \ data/pin.png \ data/time_zones_countryInfo-orig.svg \ - data/cities15000.txt \ data/admin1Codes.txt \ data/countryInfo.txt +nodist_ui_DATA = \ + data/citiesInfo.txt + +dist_noinst_DATA = \ + data/cities15000.txt \ + data/citiesExtra.txt + +data/citiesInfo.txt: data/cities15000.txt data/citiesExtra.txt + cat data/cities15000.txt data/citiesExtra.txt > $@ + tzdatadir = $(pkgdatadir)/ dist_tzdata_DATA = data/backward @@ -25,19 +34,24 @@ noinst_PROGRAMS = test-timezone all-local: check -AM_TESTS_ENVIRONMENT = TZ_DATA_FILE=$(srcdir)/data/cities15000.txt ; \ +AM_TESTS_ENVIRONMENT = TZ_DATA_FILE=$(srcdir)/data/citiesInfo.txt ; \ ADMIN1_FILE=$(srcdir)/data/admin1Codes.txt ; \ COUNTRY_FILE=$(srcdir)/data/countryInfo.txt ; \ DATADIR=$(srcdir)/data ; \ export TZ_DATA_FILE ADMIN1_FILE COUNTRY_FILE DATADIR ; -check_PROGRAMS = test-timezone +check_PROGRAMS = test-timezone \ + test-clickability test_timezone_SOURCES = test-timezone.c test_timezone_LDADD = $(LIBTIMEZONEMAP_LIBS) -lm libtimezonemap.la test_timezone_CFLAGS = $(LIBTIMEZONEMAP_CFLAGS) -TESTS = test-timezone +test_clickability_SOURCES = test-clickability.c +test_clickability_LDADD = $(LIBTIMEZONEMAP_LIBS) $(LIBXML_LIBS) libtimezonemap.la +test_clickability_CFLAGS = $(LIBTIMEZONEMAP_CFLAGS) $(LIBXML_CFLAGS) + +TESTS = test-timezone test-clickability lib_LTLIBRARIES = libtimezonemap.la diff --git a/src/data/README b/src/data/README index 1b1a737..a643fc1 100644 --- a/src/data/README +++ b/src/data/README @@ -8,6 +8,11 @@ admin1Codes.txt, cities15000.txt, countryInfo.txt These three files come from the geonames.org database. Simply find the files in http://download.geonames.org/export/dump/ and copy them to this directory. +citiesExtra.txt + These are additional cities with populations less than 15,000 used to + provide clickable locations for sparesly populated timezones. It consists of + extra lines from the geonames database. + backward This file lists links between current time zone names and obsolete time zone names. It comes from the tzdata at https://www.iana.org/time-zones diff --git a/src/data/citiesExtra.txt b/src/data/citiesExtra.txt new file mode 100644 index 0000000..1df5349 --- /dev/null +++ b/src/data/citiesExtra.txt @@ -0,0 +1,5 @@ +7521902 Tabwakea Village Tabwakea Village 2.01643 -157.48773 P PPL KI 02 KT 1881 6 Pacific/Kiritimati 2010-10-22 +8063344 Taiohae Taiohae Hakapehi -8.91093 -140.09972 P PPLA PF 04 1224 23 Pacific/Marquesas 2013-08-10 +4032824 Tuku Tuku Te Tuku -44.06667 -176.65 H STM NZ NZ 0 101 Pacific/Chatham 1993-12-30 +7731015 Eucla Airport Eucla Airport EUC,Eucla Airport,YECL -31.70674 128.87718 S AIRP AU 08 53080 0 7 Australia/Eucla 2014-11-09 +2159558 Lord Howe Island Lord Howe Island Ile Lord Howe,Lord Howe,Lord Howe Island,Lord Howe-eiland,Lord Howeoen,Lord Howeön,Lord-Howe-Eiland,Lord-Howe-Insel,Ostrov lorda Howa,Île Lord Howe,ロード・ハウ島 -31.55455 159.08246 T ISL AU 02 0 59 Australia/Lord_Howe 2015-06-01 diff --git a/src/test-clickability.c b/src/test-clickability.c new file mode 100644 index 0000000..2784b60 --- /dev/null +++ b/src/test-clickability.c @@ -0,0 +1,150 @@ +#include "config.h" +#include "tz.h" + +#include + +#include +#include +#include +#include + +/* For each offset png, check that there is at least one clickable location in + * the tzdb with the offset */ +int main(int argc, char **argv) +{ + TzDB *db; + GPtrArray *locs; + CcTimezoneLocation *loc; + TzInfo *info; + gdouble loc_offset; + + xmlDocPtr doc; + xmlXPathContextPtr xpathCtx; + xmlXPathObjectPtr xpathObj; + xmlNodeSetPtr nodes; + + const char *pixmap_dir; + gchar *path; + + GError *error = NULL; + gchar *endptr; + gdouble timezone_offset; + int i, j; + + int retval = 0; + + if (argc == 2) + { + pixmap_dir = argv[1]; + } + else if (argc == 1) + { + const char *datadir = g_getenv("DATADIR"); + if (datadir != NULL) + { + pixmap_dir = datadir; + } + else + { + pixmap_dir = "./data"; + } + } + else + { + g_message("Usage: %s [PIXMAP DIRECTORY]", argv[0]); + return 1; + } + + if (! g_file_test(pixmap_dir, G_FILE_TEST_IS_DIR)) + { + g_message("Pixmap directory %s does not exist", pixmap_dir); + return 1; + } + +#if !GLIB_CHECK_VERSION(2, 35, 0) + g_type_init(); +#endif + + xmlInitParser (); + path = g_build_filename (pixmap_dir, "time_zones_countryInfo-orig.svg", NULL); + doc = xmlParseFile (path); + if (doc == NULL) + { + g_message("Unable to parse '%s'", path); + g_free (path); + return 1; + } + g_free (path); + + /* Iterate over each layer, which can be found as element wit + * inkscape:groupmode="layer" */ + xpathCtx = xmlXPathNewContext(doc); + xmlXPathRegisterNs(xpathCtx, "svg", "http://www.w3.org/2000/svg"); + xmlXPathRegisterNs(xpathCtx, "inkscape", "http://www.inkscape.org/namespaces/inkscape"); + + xpathObj = xmlXPathEvalExpression("//svg:g[@inkscape:groupmode = 'layer']", xpathCtx); + if (!xpathObj) + { + g_message("Unable to evaluate xpath"); + return 1; + } + + nodes = xpathObj->nodesetval; + if (nodes == NULL) + { + g_message("Unable to find layers in SVG"); + return 1; + } + + db = tz_load_db (); + locs = tz_get_locations (db); + + for (i = 0; i < nodes->nodeNr; i++) + { + char *id = xmlGetProp(nodes->nodeTab[i], "id"); + + if (id[0] != 'm' && id[0] != 'p') + { + continue; + } + + timezone_offset = g_ascii_strtod (id+1, &endptr); + if (*endptr != '\0') + { + g_message ("Unable to parse layer name %s", id); + retval = 1; + } + if (id[0] == 'm') + { + timezone_offset = -timezone_offset; + } + + /* Look for a location in tzdb with the same offset */ + loc_offset = G_MAXDOUBLE; + for (j = 0; j < locs->len; j++) + { + loc = locs->pdata[j]; + info = tz_info_from_location (loc); + loc_offset = tz_location_get_utc_offset (loc) + / (60.0 * 60.0) + ((info->daylight) ? -1.0 : 0.0); + + if (loc_offset == timezone_offset) + { + break; + } + } + + if (loc_offset != timezone_offset) + { + g_message ("Unable to find location for offset %.02f", timezone_offset); + retval = 1; + } + } + + tz_db_free (db); + xmlXPathFreeObject(xpathObj); + xmlXPathFreeContext(xpathCtx); + xmlFreeDoc(doc); + + return retval; +} diff --git a/src/tz.h b/src/tz.h index b94a886..2b03e9e 100644 --- a/src/tz.h +++ b/src/tz.h @@ -30,7 +30,7 @@ #include "cc-timezone-location.h" -# define TZ_DATA_FILE "/usr/share/libtimezonemap/cities15000.txt" +# define TZ_DATA_FILE "/usr/share/libtimezonemap/citiesInfo.txt" # define ADMIN1_FILE "/usr/share/libtimezonemap/admin1Codes.txt" # define COUNTRY_FILE "/usr/share/libtimezonemap/countryInfo.txt" -- 2.5.5