libtimezonemap/0010-Add-a-new-test-to-check-whether-all-zones-can-be-sel.patch

286 lines
8.6 KiB
Diff
Raw Normal View History

From 830abfced87aefae3f574170a9948dcdc5d4bef2 Mon Sep 17 00:00:00 2001
From: David Shea <dshea@redhat.com>
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 <string.h>
+
+#include <libxml/tree.h>
+#include <libxml/parser.h>
+#include <libxml/xpath.h>
+#include <libxml/xpathInternals.h>
+
+/* 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 <g> 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