aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/Makefile.am83
-rw-r--r--src/utils.c51
-rw-r--r--tests/Makefile.am6
-rw-r--r--tests/test-utils.cc112
4 files changed, 201 insertions, 51 deletions
diff --git a/src/Makefile.am b/src/Makefile.am
index 2f247c1..093a258 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -1,44 +1,67 @@
-if BUILD_CCPANEL
-ccpaneldir = $(libdir)/control-center-1/panels/
-ccpanel_LTLIBRARIES = libindicator-datetime.la
-endif
+SHARED_CFLAGS = \
+ -Wall \
+ -Wextra -Wno-missing-field-initializers \
+ -Werror \
+ $(SERVICE_CFLAGS) \
+ $(COVERAGE_CFLAGS) \
+ -DTIMEZONE_FILE="\"/etc/timezone\"" \
+ -DG_LOG_DOMAIN=\"Indicator-Datetime\"
+
+###
+###
+###
+
+noinst_LIBRARIES = libindicator-datetime-service.a
+
+libindicator_datetime_service_a_CFLAGS = \
+ $(SHARED_CFLAGS)
+
+libindicator_datetime_service_a_SOURCES = \
+ planner.c \
+ planner.h \
+ planner-eds.c \
+ planner-eds.h \
+ service.c \
+ service.h \
+ timezone.c \
+ timezone.h \
+ timezone-file.c \
+ timezone-file.h \
+ timezone-geoclue.c \
+ timezone-geoclue.h \
+ utils.c \
+ utils.h \
+ dbus-shared.h \
+ settings-shared.h
+
+###
+###
+###
libexec_PROGRAMS = indicator-datetime-service
indicator_datetime_service_SOURCES = \
- planner.c \
- planner.h \
- planner-eds.c \
- planner-eds.h \
- service.c \
- service.h \
- main.c \
- timezone.c \
- timezone.h \
- timezone-file.c \
- timezone-file.h \
- timezone-geoclue.c \
- timezone-geoclue.h \
- utils.c \
- utils.h \
- dbus-shared.h \
- settings-shared.h
+ main.c
indicator_datetime_service_CFLAGS = \
- -Wall \
- -Wextra -Wno-missing-field-initializers \
- -Werror \
- $(SERVICE_CFLAGS) \
- $(COVERAGE_CFLAGS) \
- -DTIMEZONE_FILE="\"/etc/timezone\"" \
- -DG_LOG_DOMAIN=\"Indicator-Datetime\"
+ $(SHARED_CFLAGS)
+
indicator_datetime_service_LDADD = \
- $(SERVICE_LIBS)
+ libindicator-datetime-service.a \
+ $(SERVICE_LIBS)
+
indicator_datetime_service_LDFLAGS = \
- $(COVERAGE_LDFLAGS)
+ $(COVERAGE_LDFLAGS)
+
+###
+###
+###
if BUILD_CCPANEL
+ccpaneldir = $(libdir)/control-center-1/panels/
+ccpanel_LTLIBRARIES = libindicator-datetime.la
+
libindicator_datetime_la_SOURCES =\
datetime-prefs.c \
datetime-prefs-locations.c \
diff --git a/src/utils.c b/src/utils.c
index 1c3626d..9b0f24f 100644
--- a/src/utils.c
+++ b/src/utils.c
@@ -53,32 +53,41 @@ is_locale_12h (void)
void
split_settings_location (const gchar * location, gchar ** zone, gchar ** name)
{
- gchar * location_dup = g_strdup (location);
- gchar * first = strchr (location_dup, ' ');
+ gchar * location_dup;
+ gchar * first;
- if (first) {
- first[0] = 0;
- }
+ location_dup = g_strdup (location);
+ g_strstrip (location_dup);
- if (zone) {
- *zone = location_dup;
- }
+ if ((first = strchr (location_dup, ' ')))
+ *first = '\0';
- if (name) {
- gchar * after = first ? g_strstrip (first + 1) : NULL;
- if (after == NULL || after[0] == 0) {
- /* Make up name from zone */
- gchar * chr = strrchr (location_dup, '/');
- after = g_strdup (chr ? chr + 1 : location_dup);
- while ((chr = strchr (after, '_')) != NULL) { /* and turn underscores to spaces */
- *chr = ' ';
- }
- *name = after;
+ if (zone != NULL)
+ {
+ *zone = location_dup;
}
- else {
- *name = g_strdup (after);
+
+ if (name != NULL)
+ {
+ gchar * after = first ? g_strstrip (first + 1) : NULL;
+
+ if (after && *after)
+ {
+ *name = g_strdup (after);
+ }
+ else /* make the name from zone */
+ {
+ gchar * chr = strrchr (location_dup, '/');
+ after = g_strdup (chr ? chr + 1 : location_dup);
+
+ /* replace underscores with spaces */
+ for (chr=after; chr && *chr; chr++)
+ if (*chr == '_')
+ *chr = ' ';
+
+ *name = after;
+ }
}
- }
}
gchar *
diff --git a/tests/Makefile.am b/tests/Makefile.am
index dce6076..e204378 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -50,3 +50,9 @@ test_indicator_CPPFLAGS = $(TEST_CPPFLAGS) -DSCHEMA_DIR="\"$(top_builddir)/tests
###
###
###
+
+TESTS += test-utils
+check_PROGRAMS += test-utils
+test_utils_SOURCES = test-utils.cc
+test_utils_LDADD = $(top_builddir)/src/libindicator-datetime-service.a $(TEST_LIBS)
+test_utils_CPPFLAGS = $(TEST_CPPFLAGS) -DSCHEMA_DIR="\"$(top_builddir)/tests/\""
diff --git a/tests/test-utils.cc b/tests/test-utils.cc
new file mode 100644
index 0000000..c757a11
--- /dev/null
+++ b/tests/test-utils.cc
@@ -0,0 +1,112 @@
+/*
+Copyright 2012 Canonical Ltd.
+
+Authors:
+ Charles Kerr <charles.kerr@canonical.com>
+
+This program is free software: you can redistribute it and/or modify it
+under the terms of the GNU General Public License version 3, as published
+by the Free Software Foundation.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranties of
+MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
+PURPOSE. See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along
+with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <gtest/gtest.h>
+
+#include <glib-object.h>
+
+#include "utils.h"
+
+/***
+****
+***/
+
+TEST (UtilsTest, SplitSettingsLocation)
+{
+ guint i;
+ guint n;
+
+ struct {
+ const char * location;
+ const char * expected_zone;
+ const char * expected_name;
+ } test_cases[] = {
+ { "America/Chicago Chicago", "America/Chicago", "Chicago" },
+ { "America/Chicago Oklahoma City", "America/Chicago", "Oklahoma City" },
+ { "America/Los_Angeles", "America/Los_Angeles", "Los Angeles" },
+ { "America/Los_Angeles ", "America/Los_Angeles", "Los Angeles" },
+ { " America/Los_Angeles", "America/Los_Angeles", "Los Angeles" },
+ { " America/Los_Angeles ", "America/Los_Angeles", "Los Angeles" },
+ { "UTC UTC", "UTC", "UTC" }
+ };
+
+ for (i=0, n=G_N_ELEMENTS(test_cases); i<n; i++)
+ {
+ char * zone = NULL;
+ char * name = NULL;
+
+ split_settings_location (test_cases[i].location, &zone, &name);
+ ASSERT_STREQ (test_cases[i].expected_zone, zone);
+ ASSERT_STREQ (test_cases[i].expected_name, name);
+
+ g_free (zone);
+ g_free (name);
+ }
+}
+
+/***
+****
+***/
+
+#define EM_SPACE "\xE2\x80\x82"
+
+TEST (UtilsTest, GenerateTerseFormatString)
+{
+ guint i;
+ guint n;
+ GDateTime * arbitrary_day = g_date_time_new_local (2013, 6, 25, 12, 34, 56);
+ GDateTime * on_the_hour = g_date_time_new_local (2013, 6, 25, 12, 0, 0);
+
+ struct {
+ GDateTime * now;
+ GDateTime * time;
+ const char * expected_format_string;
+ } test_cases[] = {
+ { g_date_time_ref(arbitrary_day), g_date_time_ref(arbitrary_day), "%I:%M %p" }, /* identical time */
+ { g_date_time_ref(arbitrary_day), g_date_time_add_hours(arbitrary_day,1), "%I:%M %p" }, /* later today */
+ { g_date_time_ref(arbitrary_day), g_date_time_add_days(arbitrary_day,1), "Tomorrow" EM_SPACE "%I:%M %p" }, /* tomorrow */
+ { g_date_time_ref(arbitrary_day), g_date_time_add_days(arbitrary_day,2), "%a" EM_SPACE "%I:%M %p" },
+ { g_date_time_ref(arbitrary_day), g_date_time_add_days(arbitrary_day,6), "%a" EM_SPACE "%I:%M %p" },
+ { g_date_time_ref(arbitrary_day), g_date_time_add_days(arbitrary_day,7), "%d %b" EM_SPACE "%I:%M %p" }, /* over one week away */
+
+ { g_date_time_ref(on_the_hour), g_date_time_ref(on_the_hour), "%l %p" }, /* identical time */
+ { g_date_time_ref(on_the_hour), g_date_time_add_hours(on_the_hour,1), "%l %p" }, /* later today */
+ { g_date_time_ref(on_the_hour), g_date_time_add_days(on_the_hour,1), "Tomorrow" EM_SPACE "%l %p" }, /* tomorrow */
+ { g_date_time_ref(on_the_hour), g_date_time_add_days(on_the_hour,2), "%a" EM_SPACE "%l %p" },
+ { g_date_time_ref(on_the_hour), g_date_time_add_days(on_the_hour,6), "%a" EM_SPACE "%l %p" },
+ { g_date_time_ref(on_the_hour), g_date_time_add_days(on_the_hour,7), "%d %b" EM_SPACE "%l %p" }, /* over one week away */
+ };
+
+ for (i=0, n=G_N_ELEMENTS(test_cases); i<n; i++)
+ {
+ char * format_string;
+
+ format_string = generate_terse_format_string_at_time (test_cases[i].now,
+ test_cases[i].time);
+
+ ASSERT_STREQ (test_cases[i].expected_format_string, format_string);
+
+ g_free (format_string);
+ g_date_time_unref (test_cases[i].now);
+ g_date_time_unref (test_cases[i].time);
+ }
+
+ g_date_time_unref (arbitrary_day);
+ g_date_time_unref (on_the_hour);
+}