aboutsummaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/Makefile.am62
-rw-r--r--tests/Makefile.am.strings38
-rw-r--r--tests/test-dbus-listener.cc370
-rw-r--r--tests/test-device.cc470
-rw-r--r--tests/test-indicator.cc312
5 files changed, 1252 insertions, 0 deletions
diff --git a/tests/Makefile.am b/tests/Makefile.am
new file mode 100644
index 0000000..0c60247
--- /dev/null
+++ b/tests/Makefile.am
@@ -0,0 +1,62 @@
+TESTS =
+CLEANFILES =
+BUILT_SOURCES =
+check_PROGRAMS =
+
+###
+###
+###
+
+# stock UMB tests on user-visible strings
+include $(srcdir)/Makefile.am.strings
+
+check_LIBRARIES = libgtest.a
+nodist_libgtest_a_SOURCES = \
+ $(GTEST_SOURCE)/src/gtest-all.cc \
+ $(GTEST_SOURCE)/src/gtest_main.cc
+
+AM_CPPFLAGS = $(GTEST_CPPFLAGS) -I${top_srcdir}/src -Wall -Werror
+AM_CXXFLAGS = $(GTEST_CXXFLAGS)
+
+###
+###
+###
+
+TEST_LIBS = \
+ $(top_builddir)/src/.libs/libpower.a \
+ $(INDICATOR_LIBS) \
+ $(UPOWER_LIBS) \
+ $(COVERAGE_LDFLAGS) \
+ libgtest.a
+
+TEST_CPPFLAGS = \
+ $(AM_CPPFLAGS) \
+ $(UPOWER_CFLAGS) \
+ $(INDICATOR_CFLAGS)
+
+BUILT_SOURCES += gschemas.compiled
+CLEANFILES += gschemas.compiled
+gschemas.compiled: Makefile
+ @glib-compile-schemas --targetdir=$(abs_builddir) $(top_builddir)/data
+
+TESTS += test-device
+check_PROGRAMS += test-device
+test_device_SOURCES = test-device.cc
+test_device_LDADD = $(TEST_LIBS)
+test_device_CPPFLAGS = $(TEST_CPPFLAGS)
+
+#TESTS += test-dbus-listener
+#check_PROGRAMS += test-dbus-listener
+#test_dbus_listener_SOURCES = test-dbus-listener.cc
+#test_dbus_listener_LDADD = $(TEST_LIBS)
+#test_dbus_listener_CPPFLAGS = $(TEST_CPPFLAGS)
+
+TESTS += test-indicator
+check_PROGRAMS += test-indicator
+test_indicator_SOURCES = test-indicator.cc
+test_indicator_LDADD = $(TEST_LIBS)
+test_indicator_CPPFLAGS = $(TEST_CPPFLAGS) -DSCHEMA_DIR="\"$(top_builddir)/tests/\""
+
+###
+###
+###
diff --git a/tests/Makefile.am.strings b/tests/Makefile.am.strings
new file mode 100644
index 0000000..26a23a8
--- /dev/null
+++ b/tests/Makefile.am.strings
@@ -0,0 +1,38 @@
+TESTS += \
+ test-ellipsis \
+ test-space-ellipsis \
+ test-ascii-quotes
+
+#####
+# Tests for there being proper ellipsis instead of three periods in a row
+#####
+test-ellipsis: $(top_srcdir)/po
+ @echo "#!/bin/bash" > $@
+ @echo "(cd $(top_srcdir)/po && make $(GETTEXT_PACKAGE).pot)" >> $@
+ @echo "grep -c -e \"^msgid.*\.\.\.\\\"\" $(top_srcdir)/po/$(GETTEXT_PACKAGE).pot > /dev/null && echo \"Ellipsis found in user visible strings\" >&2 && exit 1" >> $@
+ @echo "exit 0" >> $@
+ @chmod +x $@
+
+#####
+# Tests for there being a space before an ellipsis
+#####
+test-space-ellipsis: $(top_srcdir)/po
+ @echo "#!/bin/bash" > $@
+ @echo "(cd $(top_srcdir)/po && make $(GETTEXT_PACKAGE).pot)" >> $@
+ @echo "grep -c -e \"^msgid.* …\\\"\" $(top_srcdir)/po/$(GETTEXT_PACKAGE).pot > /dev/null && echo \"Space before ellipsis found in user visible strings\" >&2 && exit 1" >> $@
+ @echo "exit 0" >> $@
+ @chmod +x $@
+
+#####
+# Tests for ASCII quote types
+#####
+test-ascii-quotes: $(top_srcdir)/po
+ @echo "#!/bin/bash" > $@
+ @echo "(cd $(top_srcdir)/po && make $(GETTEXT_PACKAGE).pot)" >> $@
+ @echo "grep -c -e \"^msgid \\\".*'.*\\\"\" $(top_srcdir)/po/$(GETTEXT_PACKAGE).pot > /dev/null && echo \"ASCII apostrophy found in user visible strings\" >&2 && exit 1" >> $@
+ @echo "grep -c -e \"^msgid \\\".*\\\".*\\\"\" $(top_srcdir)/po/$(GETTEXT_PACKAGE).pot > /dev/null && echo \"ASCII quote found in user visible strings\" >&2 && exit 1" >> $@
+ @echo "grep -c -e \"^msgid \\\".*\\\`.*\\\"\" $(top_srcdir)/po/$(GETTEXT_PACKAGE).pot > /dev/null && echo \"ASCII backtick found in user visible strings\" >&2 && exit 1" >> $@
+ @echo "exit 0" >> $@
+ @chmod +x $@
+
+CLEANFILES += $(TESTS)
diff --git a/tests/test-dbus-listener.cc b/tests/test-dbus-listener.cc
new file mode 100644
index 0000000..8bf74bf
--- /dev/null
+++ b/tests/test-dbus-listener.cc
@@ -0,0 +1,370 @@
+/*
+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 "dbus-listener.h"
+#include "device.h"
+
+/***
+****
+***/
+
+namespace
+{
+ void ensure_glib_initialized ()
+ {
+ static bool initialized = false;
+
+ if (G_UNLIKELY(!initialized))
+ {
+ initialized = true;
+ g_type_init();
+ }
+ }
+}
+
+/***
+****
+***/
+
+class DbusListenerTest : public ::testing::Test
+{
+ protected:
+ GSList * devices;
+ GDBusConnection * connection;
+ GMainLoop * mainloop;
+ GTestDBus * bus;
+ GDBusNodeInfo * gsd_power_introspection_data;
+ GVariant * get_devices_retval;
+ bool bus_acquired;
+ bool name_acquired;
+ int gsd_name_ownership_id;
+ int gsd_power_registration_id;
+ char * gsd_power_error_string;
+
+ protected:
+
+ static void
+ on_bus_acquired (GDBusConnection *conn, const gchar * name, gpointer gself)
+ {
+ g_debug ("bus acquired: %s, connection is %p", name, conn);
+
+ DbusListenerTest * test = static_cast<DbusListenerTest*> (gself);
+ test->connection = conn;
+ test->bus_acquired = true;
+ }
+
+ static void
+ on_name_acquired (GDBusConnection * conn, const gchar * name, gpointer gself)
+ {
+ g_debug ("name acquired: %s, connection is %p", name, conn);
+
+ DbusListenerTest * test = static_cast<DbusListenerTest*> (gself);
+ test->name_acquired = true;
+ g_main_loop_quit (test->mainloop);
+ }
+
+ static void
+ on_name_lost (GDBusConnection * conn, const gchar * name, gpointer gself)
+ {
+ g_debug ("name lost: %s, connection is %p", name, conn);
+
+ DbusListenerTest * test = static_cast<DbusListenerTest*> (gself);
+ test->name_acquired = false;
+ g_main_loop_quit (test->mainloop);
+ }
+
+ protected:
+
+ static void
+ on_devices_enumerated (IndicatorPowerDbusListener * l, GSList * devices, gpointer gself)
+ {
+ g_debug ("on_devices_enumerated");
+
+ DbusListenerTest * test = static_cast<DbusListenerTest*> (gself);
+ test->name_acquired = false;
+ g_slist_foreach (devices, (GFunc)g_object_ref, NULL);
+ test->devices = g_slist_copy (devices);
+ g_main_loop_quit (test->mainloop);
+ }
+
+ static void
+ gsd_power_handle_method_call (GDBusConnection * connection,
+ const gchar * sender,
+ const gchar * object_path,
+ const gchar * interface_name,
+ const gchar * method_name,
+ GVariant * parameters,
+ GDBusMethodInvocation * invocation,
+ gpointer gself)
+ {
+ DbusListenerTest * test = static_cast<DbusListenerTest*> (gself);
+ g_assert (!g_strcmp0 (method_name, "GetDevices"));
+ if (test->gsd_power_error_string != NULL) {
+ const GQuark domain = g_quark_from_static_string ("mock-gsd-power");
+ g_message ("returning an error");
+ g_dbus_method_invocation_return_error_literal (invocation, domain, 0, test->gsd_power_error_string);
+ } else {
+ g_dbus_method_invocation_return_value (invocation, test->get_devices_retval);
+ }
+ }
+
+ protected:
+
+ virtual void SetUp()
+ {
+ bus_acquired = false;
+ name_acquired = false;
+ connection = NULL;
+ devices = NULL;
+ get_devices_retval = NULL;
+ gsd_power_error_string = NULL;
+
+ // bring up the test bus
+ ensure_glib_initialized ();
+ mainloop = g_main_loop_new (NULL, FALSE);
+ bus = g_test_dbus_new (G_TEST_DBUS_NONE);
+ g_test_dbus_up (bus);
+
+ // own org.gnome.SettingsDameon on this test bus
+ gsd_name_ownership_id = g_bus_own_name (
+ G_BUS_TYPE_SESSION,
+ GSD_SERVICE,
+ G_BUS_NAME_OWNER_FLAGS_NONE,
+ on_bus_acquired,
+ on_name_acquired,
+ on_name_lost,
+ this, NULL);
+ ASSERT_FALSE (bus_acquired);
+ ASSERT_FALSE (name_acquired);
+ ASSERT_TRUE (connection == NULL);
+ g_main_loop_run (mainloop);
+ ASSERT_TRUE (bus_acquired);
+ ASSERT_TRUE (name_acquired);
+ ASSERT_TRUE (G_IS_DBUS_CONNECTION(connection));
+
+ // parse the org.gnome.SettingsDaemon.Power interface
+ const gchar introspection_xml[] =
+ "<node>"
+ " <interface name='org.gnome.SettingsDaemon.Power'>"
+ " <property name='Icon' type='s' access='read'>"
+ " </property>"
+ " <property name='Tooltip' type='s' access='read'>"
+ " </property>"
+ " <method name='GetDevices'>"
+ " <arg name='devices' type='a(susdut)' direction='out' />"
+ " </method>"
+ " </interface>"
+ "</node>";
+ gsd_power_introspection_data = g_dbus_node_info_new_for_xml(introspection_xml, NULL);
+ ASSERT_TRUE (gsd_power_introspection_data != NULL);
+
+ // Set up a mock GSD.
+ // All it really does is wait for calls to GetDevice and
+ // returns the get_devices_retval variant
+ const GDBusInterfaceVTable gsd_power_interface_vtable = {
+ gsd_power_handle_method_call,
+ NULL, /* GetProperty */
+ NULL, /* SetProperty */
+ };
+ gsd_power_registration_id = g_dbus_connection_register_object (connection,
+ GSD_POWER_DBUS_PATH,
+ gsd_power_introspection_data->interfaces[0],
+ &gsd_power_interface_vtable,
+ this, NULL, NULL);
+ }
+
+ virtual void TearDown()
+ {
+ g_free (gsd_power_error_string);
+
+ g_dbus_connection_unregister_object (connection, gsd_power_registration_id);
+
+ g_dbus_node_info_unref (gsd_power_introspection_data);
+ g_bus_unown_name (gsd_name_ownership_id);
+
+ g_slist_free_full (devices, g_object_unref);
+ g_test_dbus_down (bus);
+ g_main_loop_unref (mainloop);
+ }
+};
+
+/***
+****
+***/
+
+
+TEST_F(DbusListenerTest, GSDHasPowerAndBattery)
+{
+ // build a GetDevices retval that shows an AC line and a discharging battery
+ GVariantBuilder * builder = g_variant_builder_new (G_VARIANT_TYPE("a(susdut)"));
+ g_variant_builder_add (builder, "(susdut)",
+ "/org/freedesktop/UPower/devices/line_power_AC",
+ UP_DEVICE_KIND_LINE_POWER,
+ ". GThemedIcon ac-adapter-symbolic ac-adapter ",
+ 0.0,
+ UP_DEVICE_STATE_UNKNOWN,
+ 0);
+ g_variant_builder_add (builder, "(susdut)",
+ "/org/freedesktop/UPower/devices/battery_BAT0",
+ UP_DEVICE_KIND_BATTERY,
+ ". GThemedIcon battery-good-symbolic gpm-battery-060 battery-good ",
+ 52.871712,
+ UP_DEVICE_STATE_DISCHARGING,
+ 8834);
+ GVariant * value = g_variant_builder_end (builder);
+ get_devices_retval = g_variant_new_tuple (&value, 1);
+ g_variant_builder_unref (builder);
+
+ // create an i-power dbus listener to watch for GSD
+ ASSERT_EQ (g_slist_length(devices), 0);
+ GObject * o = G_OBJECT (g_object_new (INDICATOR_POWER_DBUS_LISTENER_TYPE, NULL));
+ ASSERT_TRUE (o != NULL);
+ ASSERT_TRUE (INDICATOR_IS_POWER_DBUS_LISTENER(o));
+ g_signal_connect(o, INDICATOR_POWER_DBUS_LISTENER_DEVICES_ENUMERATED,
+ G_CALLBACK(on_devices_enumerated), this);
+ g_main_loop_run (mainloop);
+
+ // test the devices should have gotten
+ ASSERT_EQ (g_slist_length(devices), 2);
+ IndicatorPowerDevice * device = INDICATOR_POWER_DEVICE (g_slist_nth_data (devices, 0));
+ ASSERT_EQ (indicator_power_device_get_kind(device), UP_DEVICE_KIND_LINE_POWER);
+ ASSERT_STREQ ("/org/freedesktop/UPower/devices/line_power_AC", indicator_power_device_get_object_path(device));
+ device = INDICATOR_POWER_DEVICE (g_slist_nth_data (devices, 1));
+ ASSERT_EQ (UP_DEVICE_KIND_BATTERY, indicator_power_device_get_kind(device));
+ ASSERT_STREQ ("/org/freedesktop/UPower/devices/battery_BAT0", indicator_power_device_get_object_path(device));
+
+ // cleanup
+ g_object_run_dispose (o); // used to get coverage of both branches in the object's dispose func's g_clear_*() calls
+ g_object_unref (o);
+}
+
+TEST_F(DbusListenerTest, GSDHasNoDevices)
+{
+ GVariantBuilder * builder = g_variant_builder_new (G_VARIANT_TYPE("a(susdut)"));
+ GVariant * value = g_variant_builder_end (builder);
+ get_devices_retval = g_variant_new_tuple (&value, 1);
+ g_variant_builder_unref (builder);
+
+ // create an i-power dbus listener to watch for GSD
+ ASSERT_EQ (g_slist_length(devices), 0);
+ GObject * o = G_OBJECT (g_object_new (INDICATOR_POWER_DBUS_LISTENER_TYPE, NULL));
+ ASSERT_TRUE (o != NULL);
+ ASSERT_TRUE (INDICATOR_IS_POWER_DBUS_LISTENER(o));
+ g_signal_connect(o, INDICATOR_POWER_DBUS_LISTENER_DEVICES_ENUMERATED,
+ G_CALLBACK(on_devices_enumerated), this);
+ g_main_loop_run (mainloop);
+
+ // test the devices should have gotten
+ ASSERT_EQ (g_slist_length(devices), 0);
+
+ // FIXME: this test improves coverage and confirms that the code
+ // doesn't crash, but more meaningful tests would be better too.
+
+ // cleanup
+ g_object_run_dispose (o); // used to get coverage of both branches in the object's dispose func's g_clear_*() calls
+ g_object_unref (o);
+}
+
+TEST_F(DbusListenerTest, GSDReturnsError)
+{
+ gsd_power_error_string = g_strdup ("no devices for you lol");
+
+ // create an i-power dbus listener to watch for GSD
+ ASSERT_EQ (g_slist_length(devices), 0);
+ GObject * o = G_OBJECT (g_object_new (INDICATOR_POWER_DBUS_LISTENER_TYPE, NULL));
+ ASSERT_TRUE (o != NULL);
+ ASSERT_TRUE (INDICATOR_IS_POWER_DBUS_LISTENER(o));
+ g_signal_connect(o, INDICATOR_POWER_DBUS_LISTENER_DEVICES_ENUMERATED,
+ G_CALLBACK(on_devices_enumerated), this);
+ g_main_loop_run (mainloop);
+
+ // test the devices should have gotten
+ ASSERT_EQ (g_slist_length(devices), 0);
+
+ // FIXME: this test improves coverage and confirms that the code
+ // doesn't crash, but more meaningful tests would be better too.
+
+ // cleanup
+ g_object_run_dispose (o); // used to get coverage of both branches in the object's dispose func's g_clear_*() calls
+ g_object_unref (o);
+}
+
+/* This test emits a PropertiesChanged signal and confirms that
+ the dbus listener asks for a fresh set of devices as a result. */
+TEST_F(DbusListenerTest, GSDPropChanged)
+{
+ gsd_power_error_string = g_strdup ("no devices for you lol");
+
+ // create an i-power dbus listener to watch for GSD
+ ASSERT_EQ (g_slist_length(devices), 0);
+ GObject * o = G_OBJECT (g_object_new (INDICATOR_POWER_DBUS_LISTENER_TYPE, NULL));
+ ASSERT_TRUE (INDICATOR_IS_POWER_DBUS_LISTENER(o));
+ g_signal_connect(o, INDICATOR_POWER_DBUS_LISTENER_DEVICES_ENUMERATED,
+ G_CALLBACK(on_devices_enumerated), this);
+ g_main_loop_run (mainloop);
+ // test the devices should have gotten
+ ASSERT_EQ (g_slist_length(devices), 0);
+
+ // build a GetDevices retval that shows an AC line and a discharging battery
+ g_clear_pointer (&gsd_power_error_string, g_free);
+ GVariantBuilder * builder = g_variant_builder_new (G_VARIANT_TYPE("a(susdut)"));
+ g_variant_builder_add (builder, "(susdut)",
+ "/org/freedesktop/UPower/devices/line_power_AC",
+ UP_DEVICE_KIND_LINE_POWER,
+ ". GThemedIcon ac-adapter-symbolic ac-adapter ",
+ 0.0,
+ UP_DEVICE_STATE_UNKNOWN,
+ 0);
+ g_variant_builder_add (builder, "(susdut)",
+ "/org/freedesktop/UPower/devices/battery_BAT0",
+ UP_DEVICE_KIND_BATTERY,
+ ". GThemedIcon battery-good-symbolic gpm-battery-060 battery-good ",
+ 52.871712,
+ UP_DEVICE_STATE_DISCHARGING,
+ 8834);
+ GVariant * value = g_variant_builder_end (builder);
+ get_devices_retval = g_variant_new_tuple (&value, 1);
+ g_variant_builder_unref (builder);
+
+ // tell the listener that some property changed
+ GVariantBuilder props_builder;
+ g_variant_builder_init (&props_builder, G_VARIANT_TYPE ("a{sv}"));
+ GVariant * props_changed = g_variant_new ("(s@a{sv}@as)", GSD_POWER_DBUS_INTERFACE,
+ g_variant_builder_end (&props_builder),
+ g_variant_new_strv (NULL, 0));
+ g_variant_ref_sink (props_changed);
+ GError * error = NULL;
+ g_dbus_connection_emit_signal (connection,
+ NULL,
+ GSD_POWER_DBUS_PATH,
+ "org.freedesktop.DBus.Properties",
+ "PropertiesChanged",
+ props_changed,
+ &error);
+ ASSERT_TRUE(error == NULL);
+
+ // give i-power's dbus listener a chance to ask for a fresh device list
+ g_main_loop_run (mainloop);
+ ASSERT_EQ (g_slist_length(devices), 2);
+
+ // cleanup
+ g_object_unref (o);
+}
diff --git a/tests/test-device.cc b/tests/test-device.cc
new file mode 100644
index 0000000..2c88ea1
--- /dev/null
+++ b/tests/test-device.cc
@@ -0,0 +1,470 @@
+/*
+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 "device.h"
+
+namespace
+{
+ void ensure_glib_initialized ()
+ {
+ static bool initialized = false;
+
+ if (G_UNLIKELY(!initialized))
+ {
+ initialized = true;
+ g_type_init();
+ }
+ }
+}
+
+class DeviceTest : public ::testing::Test
+{
+ protected:
+
+ virtual void SetUp()
+ {
+ ensure_glib_initialized ();
+ }
+
+ virtual void TearDown()
+ {
+ }
+
+ protected:
+
+ void check_icon_names (const IndicatorPowerDevice * device, const char * expected)
+ {
+ char ** names = indicator_power_device_get_icon_names (device);
+ char * str = g_strjoinv (";", names);
+ ASSERT_STREQ (expected, str);
+ g_free (str);
+ g_strfreev (names);
+ }
+
+ void check_strings (const IndicatorPowerDevice * device,
+ const char * expected_timestring,
+ const char * expected_details,
+ const char * expected_accessible)
+ {
+ char * timestring = NULL;
+ char * details = NULL;
+ char * accessible = NULL;
+
+ indicator_power_device_get_time_details (device, &timestring, &details, &accessible);
+ EXPECT_STREQ (expected_timestring, timestring);
+ EXPECT_STREQ (expected_details, details);
+ EXPECT_STREQ (expected_accessible, accessible);
+
+ g_free (accessible);
+ g_free (details);
+ g_free (timestring);
+ }
+};
+
+
+/***
+****
+***/
+
+TEST_F(DeviceTest, GObjectNew)
+{
+ ensure_glib_initialized ();
+
+ GObject * o = G_OBJECT (g_object_new (INDICATOR_POWER_DEVICE_TYPE, NULL));
+ ASSERT_TRUE (o != NULL);
+ ASSERT_TRUE (INDICATOR_IS_POWER_DEVICE(o));
+ g_object_run_dispose (o); // used to get coverage of both branches in the object's dispose func's g_clear_*() calls
+ g_object_unref (o);
+}
+
+TEST_F(DeviceTest, Properties)
+{
+ int i;
+ gdouble d;
+ GObject * o;
+ gchar * str;
+ guint64 u64;
+ const gchar * key;
+
+ ensure_glib_initialized ();
+
+ o = G_OBJECT (g_object_new (INDICATOR_POWER_DEVICE_TYPE, NULL));
+ ASSERT_TRUE (o != NULL);
+ ASSERT_TRUE (INDICATOR_IS_POWER_DEVICE(o));
+
+ // Test getting & setting a Device's properties.
+
+ // KIND
+ key = INDICATOR_POWER_DEVICE_KIND;
+ g_object_set (o, key, UP_DEVICE_KIND_BATTERY, NULL);
+ g_object_get (o, key, &i, NULL);
+ ASSERT_EQ (i, UP_DEVICE_KIND_BATTERY);
+
+ // STATE
+ key = INDICATOR_POWER_DEVICE_STATE;
+ g_object_set (o, key, UP_DEVICE_STATE_CHARGING, NULL);
+ g_object_get (o, key, &i, NULL);
+ ASSERT_EQ (i, UP_DEVICE_STATE_CHARGING);
+
+ // OBJECT_PATH
+ key = INDICATOR_POWER_DEVICE_OBJECT_PATH;
+ g_object_set (o, key, "/object/path", NULL);
+ g_object_get (o, key, &str, NULL);
+ ASSERT_STREQ (str, "/object/path");
+ g_free (str);
+
+ // PERCENTAGE
+ key = INDICATOR_POWER_DEVICE_PERCENTAGE;
+ g_object_set (o, key, 50.0, NULL);
+ g_object_get (o, key, &d, NULL);
+ ASSERT_EQ((int)d, 50);
+
+ // TIME
+ key = INDICATOR_POWER_DEVICE_TIME;
+ g_object_set (o, key, (guint64)30, NULL);
+ g_object_get (o, key, &u64, NULL);
+ ASSERT_EQ(u64, 30);
+
+ // cleanup
+ g_object_unref (o);
+}
+
+TEST_F(DeviceTest, New)
+{
+ ensure_glib_initialized ();
+
+ IndicatorPowerDevice * device = indicator_power_device_new ("/object/path",
+ UP_DEVICE_KIND_BATTERY,
+ 50.0,
+ UP_DEVICE_STATE_CHARGING,
+ 30);
+ ASSERT_TRUE (device != NULL);
+ ASSERT_TRUE (INDICATOR_IS_POWER_DEVICE(device));
+ ASSERT_EQ (indicator_power_device_get_kind(device), UP_DEVICE_KIND_BATTERY);
+ ASSERT_EQ (indicator_power_device_get_state(device), UP_DEVICE_STATE_CHARGING);
+ ASSERT_STREQ (indicator_power_device_get_object_path(device), "/object/path");
+ ASSERT_EQ ((int)indicator_power_device_get_percentage(device), 50);
+ ASSERT_EQ (indicator_power_device_get_time(device), 30);
+
+ // cleanup
+ g_object_unref (device);
+}
+
+TEST_F(DeviceTest, NewFromVariant)
+{
+ ensure_glib_initialized ();
+
+ GVariant * variant = g_variant_new ("(susdut)",
+ "/object/path",
+ UP_DEVICE_KIND_BATTERY,
+ "icon",
+ 50.0,
+ UP_DEVICE_STATE_CHARGING,
+ 30);
+ IndicatorPowerDevice * device = indicator_power_device_new_from_variant (variant);
+ ASSERT_TRUE (variant != NULL);
+ ASSERT_TRUE (device != NULL);
+ ASSERT_TRUE (INDICATOR_IS_POWER_DEVICE(device));
+ ASSERT_EQ (indicator_power_device_get_kind(device), UP_DEVICE_KIND_BATTERY);
+ ASSERT_EQ (indicator_power_device_get_state(device), UP_DEVICE_STATE_CHARGING);
+ ASSERT_STREQ (indicator_power_device_get_object_path(device), "/object/path");
+ ASSERT_EQ ((int)indicator_power_device_get_percentage(device), 50);
+ ASSERT_EQ (indicator_power_device_get_time(device), 30);
+
+ // cleanup
+ g_object_unref (device);
+ g_variant_unref (variant);
+}
+
+TEST_F(DeviceTest, BadAccessors)
+{
+ ensure_glib_initialized ();
+
+ // test that these functions can handle being passed NULL pointers
+ IndicatorPowerDevice * device = NULL;
+ indicator_power_device_get_kind (device);
+ indicator_power_device_get_time (device);
+ indicator_power_device_get_state (device);
+ indicator_power_device_get_percentage (device);
+ indicator_power_device_get_object_path (device);
+
+ // test that these functions can handle being passed non-device GObjects
+ device = reinterpret_cast<IndicatorPowerDevice*>(g_cancellable_new ());
+ indicator_power_device_get_kind (device);
+ indicator_power_device_get_time (device);
+ indicator_power_device_get_state (device);
+ indicator_power_device_get_percentage (device);
+ indicator_power_device_get_object_path (device);
+ g_object_unref (device);
+}
+
+/***
+****
+***/
+
+TEST_F(DeviceTest, IconNames)
+{
+ IndicatorPowerDevice * device = INDICATOR_POWER_DEVICE (g_object_new (INDICATOR_POWER_DEVICE_TYPE, NULL));
+ GObject * o = G_OBJECT(device);
+
+ // bad arguments
+ ASSERT_TRUE (indicator_power_device_get_icon_names (NULL) == NULL);
+
+ // power
+ g_object_set (o, INDICATOR_POWER_DEVICE_KIND, UP_DEVICE_KIND_LINE_POWER,
+ NULL);
+ check_icon_names (device, "ac-adapter-symbolic;"
+ "ac-adapter");
+
+ // monitor
+ g_object_set (o, INDICATOR_POWER_DEVICE_KIND, UP_DEVICE_KIND_MONITOR,
+ NULL);
+ check_icon_names (device, "gpm-monitor-symbolic;"
+ "gpm-monitor");
+
+ // empty battery
+ g_object_set (o, INDICATOR_POWER_DEVICE_KIND, UP_DEVICE_KIND_BATTERY,
+ INDICATOR_POWER_DEVICE_STATE, UP_DEVICE_STATE_EMPTY,
+ NULL);
+ check_icon_names (device, "battery-empty-symbolic;"
+ "gpm-battery-empty;"
+ "gpm-battery-000;"
+ "battery-empty");
+
+ // charged battery
+ g_object_set (o, INDICATOR_POWER_DEVICE_KIND, UP_DEVICE_KIND_BATTERY,
+ INDICATOR_POWER_DEVICE_STATE, UP_DEVICE_STATE_FULLY_CHARGED,
+ NULL);
+ check_icon_names (device, "battery-full-charged-symbolic;battery-full-charging-symbolic;"
+ "gpm-battery-full;gpm-battery-100;"
+ "battery-full-charged;battery-full-charging");
+
+ // charging battery, 95%
+ g_object_set (o, INDICATOR_POWER_DEVICE_KIND, UP_DEVICE_KIND_BATTERY,
+ INDICATOR_POWER_DEVICE_STATE, UP_DEVICE_STATE_CHARGING,
+ INDICATOR_POWER_DEVICE_PERCENTAGE, 95.0,
+ NULL);
+ check_icon_names (device, "battery-caution-charging-symbolic;"
+ "gpm-battery-000-charging;"
+ "battery-caution-charging");
+
+ // charging battery, 85%
+ g_object_set (o, INDICATOR_POWER_DEVICE_KIND, UP_DEVICE_KIND_BATTERY,
+ INDICATOR_POWER_DEVICE_STATE, UP_DEVICE_STATE_CHARGING,
+ INDICATOR_POWER_DEVICE_PERCENTAGE, 85.0,
+ NULL);
+ check_icon_names (device, "battery-caution-charging-symbolic;"
+ "gpm-battery-000-charging;"
+ "battery-caution-charging");
+
+ // charging battery, 50%
+ g_object_set (o, INDICATOR_POWER_DEVICE_KIND, UP_DEVICE_KIND_BATTERY,
+ INDICATOR_POWER_DEVICE_STATE, UP_DEVICE_STATE_CHARGING,
+ INDICATOR_POWER_DEVICE_PERCENTAGE, 50.0,
+ NULL);
+ check_icon_names (device, "battery-caution-charging-symbolic;"
+ "gpm-battery-000-charging;"
+ "battery-caution-charging");
+
+ // charging battery, 25%
+ g_object_set (o, INDICATOR_POWER_DEVICE_KIND, UP_DEVICE_KIND_BATTERY,
+ INDICATOR_POWER_DEVICE_STATE, UP_DEVICE_STATE_CHARGING,
+ INDICATOR_POWER_DEVICE_PERCENTAGE, 25.0,
+ NULL);
+ check_icon_names (device, "battery-caution-charging-symbolic;"
+ "gpm-battery-000-charging;"
+ "battery-caution-charging");
+
+ // charging battery, 5%
+ g_object_set (o, INDICATOR_POWER_DEVICE_KIND, UP_DEVICE_KIND_BATTERY,
+ INDICATOR_POWER_DEVICE_STATE, UP_DEVICE_STATE_CHARGING,
+ INDICATOR_POWER_DEVICE_PERCENTAGE, 5.0,
+ NULL);
+ check_icon_names (device, "battery-caution-charging-symbolic;"
+ "gpm-battery-000-charging;"
+ "battery-caution-charging");
+
+
+ // discharging battery, 95%
+ g_object_set (o, INDICATOR_POWER_DEVICE_KIND, UP_DEVICE_KIND_BATTERY,
+ INDICATOR_POWER_DEVICE_STATE, UP_DEVICE_STATE_DISCHARGING,
+ INDICATOR_POWER_DEVICE_PERCENTAGE, 95.0,
+ NULL);
+ check_icon_names (device, "battery-full-symbolic;"
+ "gpm-battery-100;"
+ "battery-full");
+
+ // discharging battery, 85%
+ g_object_set (o, INDICATOR_POWER_DEVICE_KIND, UP_DEVICE_KIND_BATTERY,
+ INDICATOR_POWER_DEVICE_STATE, UP_DEVICE_STATE_DISCHARGING,
+ INDICATOR_POWER_DEVICE_PERCENTAGE, 85.0,
+ NULL);
+ check_icon_names (device, "battery-full-symbolic;"
+ "gpm-battery-080;"
+ "battery-full");
+
+ // discharging battery, 50% -- 1 hour left
+ g_object_set (o, INDICATOR_POWER_DEVICE_KIND, UP_DEVICE_KIND_BATTERY,
+ INDICATOR_POWER_DEVICE_STATE, UP_DEVICE_STATE_DISCHARGING,
+ INDICATOR_POWER_DEVICE_PERCENTAGE, 50.0,
+ INDICATOR_POWER_DEVICE_TIME, (guint64)(60*60),
+ NULL);
+ check_icon_names (device, "battery-good-symbolic;"
+ "gpm-battery-060;"
+ "battery-good");
+
+ // discharging battery, 25% -- 1 hour left
+ g_object_set (o, INDICATOR_POWER_DEVICE_KIND, UP_DEVICE_KIND_BATTERY,
+ INDICATOR_POWER_DEVICE_STATE, UP_DEVICE_STATE_DISCHARGING,
+ INDICATOR_POWER_DEVICE_PERCENTAGE, 25.0,
+ INDICATOR_POWER_DEVICE_TIME, (guint64)(60*60),
+ NULL);
+ check_icon_names (device, "battery-good-symbolic;"
+ "gpm-battery-040;"
+ "battery-good");
+
+ // discharging battery, 25% -- 15 minutes left
+ g_object_set (o, INDICATOR_POWER_DEVICE_KIND, UP_DEVICE_KIND_BATTERY,
+ INDICATOR_POWER_DEVICE_STATE, UP_DEVICE_STATE_DISCHARGING,
+ INDICATOR_POWER_DEVICE_PERCENTAGE, 25.0,
+ INDICATOR_POWER_DEVICE_TIME, (guint64)(60*15),
+ NULL);
+ check_icon_names (device, "battery-low-symbolic;"
+ "gpm-battery-020;"
+ "battery-low");
+
+ // discharging battery, 5% -- 1 hour left
+ g_object_set (o, INDICATOR_POWER_DEVICE_KIND, UP_DEVICE_KIND_BATTERY,
+ INDICATOR_POWER_DEVICE_STATE, UP_DEVICE_STATE_DISCHARGING,
+ INDICATOR_POWER_DEVICE_PERCENTAGE, 5.0,
+ INDICATOR_POWER_DEVICE_TIME, (guint64)(60*60),
+ NULL);
+ check_icon_names (device, "battery-good-symbolic;"
+ "gpm-battery-040;"
+ "battery-good");
+
+ // discharging battery, 5% -- 15 minutes left
+ g_object_set (o, INDICATOR_POWER_DEVICE_KIND, UP_DEVICE_KIND_BATTERY,
+ INDICATOR_POWER_DEVICE_STATE, UP_DEVICE_STATE_DISCHARGING,
+ INDICATOR_POWER_DEVICE_PERCENTAGE, 5.0,
+ INDICATOR_POWER_DEVICE_TIME, (guint64)(60*15),
+ NULL);
+ check_icon_names (device, "battery-caution-symbolic;"
+ "gpm-battery-000;"
+ "battery-caution");
+ // state unknown
+ g_object_set (o, INDICATOR_POWER_DEVICE_KIND, UP_DEVICE_KIND_BATTERY,
+ INDICATOR_POWER_DEVICE_STATE, UP_DEVICE_STATE_UNKNOWN,
+ NULL);
+ check_icon_names (device, "battery-missing-symbolic;"
+ "gpm-battery-missing;"
+ "battery-missing");
+
+ // cleanup
+ g_object_unref(o);
+}
+
+
+TEST_F(DeviceTest, Labels)
+{
+ // set our language so that i18n won't break these tests
+ char * real_lang = g_strdup(g_getenv ("LANG"));
+ g_setenv ("LANG", "en_US.UTF-8", TRUE);
+
+ // bad args: NULL device
+ check_strings (NULL, NULL, NULL, NULL);
+
+ // bad args: a GObject that isn't a device
+ GObject * o = G_OBJECT(g_cancellable_new());
+ check_strings ((IndicatorPowerDevice*)o, NULL, NULL, NULL);
+ g_object_unref (o);
+
+ /**
+ ***
+ **/
+
+ IndicatorPowerDevice * device = INDICATOR_POWER_DEVICE (g_object_new (INDICATOR_POWER_DEVICE_TYPE, NULL));
+ o = G_OBJECT(device);
+
+ // charging
+ g_object_set (o, INDICATOR_POWER_DEVICE_KIND, UP_DEVICE_KIND_BATTERY,
+ INDICATOR_POWER_DEVICE_STATE, UP_DEVICE_STATE_CHARGING,
+ INDICATOR_POWER_DEVICE_PERCENTAGE, 50.0,
+ INDICATOR_POWER_DEVICE_TIME, guint64(60*61),
+ NULL);
+ check_strings (device, "(1:01)",
+ "Battery (1:01 to charge)",
+ "Battery (1 hour 1 minute to charge (50%))");
+
+ // discharging, < 12 hours left
+ g_object_set (o, INDICATOR_POWER_DEVICE_KIND, UP_DEVICE_KIND_BATTERY,
+ INDICATOR_POWER_DEVICE_STATE, UP_DEVICE_STATE_DISCHARGING,
+ INDICATOR_POWER_DEVICE_PERCENTAGE, 50.0,
+ INDICATOR_POWER_DEVICE_TIME, guint64(60*61),
+ NULL);
+ check_strings (device, "1:01",
+ "Battery (1:01 left)",
+ "Battery (1 hour 1 minute left (50%))");
+
+ // discharging, > 12 hours left
+ g_object_set (o, INDICATOR_POWER_DEVICE_KIND, UP_DEVICE_KIND_BATTERY,
+ INDICATOR_POWER_DEVICE_STATE, UP_DEVICE_STATE_DISCHARGING,
+ INDICATOR_POWER_DEVICE_PERCENTAGE, 50.0,
+ INDICATOR_POWER_DEVICE_TIME, guint64(60*60*13),
+ NULL);
+ check_strings (device, "13:00", "Battery", "Battery");
+
+ // fully charged
+ g_object_set (o, INDICATOR_POWER_DEVICE_KIND, UP_DEVICE_KIND_BATTERY,
+ INDICATOR_POWER_DEVICE_STATE, UP_DEVICE_STATE_FULLY_CHARGED,
+ INDICATOR_POWER_DEVICE_PERCENTAGE, 100.0,
+ INDICATOR_POWER_DEVICE_TIME, guint64(0),
+ NULL);
+ check_strings (device, "", "Battery (charged)", "Battery (charged)");
+
+ // percentage but no time estimate
+ g_object_set (o, INDICATOR_POWER_DEVICE_KIND, UP_DEVICE_KIND_BATTERY,
+ INDICATOR_POWER_DEVICE_STATE, UP_DEVICE_STATE_DISCHARGING,
+ INDICATOR_POWER_DEVICE_PERCENTAGE, 50.0,
+ INDICATOR_POWER_DEVICE_TIME, guint64(0),
+ NULL);
+ check_strings (device, "(50%)", "Battery (50%)", "Battery (50%)");
+
+ // no percentage, no time estimate
+ g_object_set (o, INDICATOR_POWER_DEVICE_KIND, UP_DEVICE_KIND_BATTERY,
+ INDICATOR_POWER_DEVICE_STATE, UP_DEVICE_STATE_DISCHARGING,
+ INDICATOR_POWER_DEVICE_PERCENTAGE, 0.0,
+ INDICATOR_POWER_DEVICE_TIME, guint64(0),
+ NULL);
+ check_strings (device, "(not present)", "Battery (not present)", "Battery (not present)");
+
+ // power line
+ g_object_set (o, INDICATOR_POWER_DEVICE_KIND, UP_DEVICE_KIND_LINE_POWER,
+ INDICATOR_POWER_DEVICE_STATE, UP_DEVICE_STATE_UNKNOWN,
+ INDICATOR_POWER_DEVICE_PERCENTAGE, 0.0,
+ INDICATOR_POWER_DEVICE_TIME, guint64(0),
+ NULL);
+ check_strings (device, "AC Adapter", "AC Adapter", "AC Adapter");
+
+ // cleanup
+ g_object_unref(o);
+ g_setenv ("LANG", real_lang, TRUE);
+ g_free (real_lang);
+}
diff --git a/tests/test-indicator.cc b/tests/test-indicator.cc
new file mode 100644
index 0000000..b9f7321
--- /dev/null
+++ b/tests/test-indicator.cc
@@ -0,0 +1,312 @@
+/*
+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 "dbus-listener.h"
+#include "device.h"
+#include "indicator-power.h"
+
+/***
+****
+***/
+
+namespace
+{
+ void ensure_glib_initialized ()
+ {
+ static bool initialized = false;
+
+ if (G_UNLIKELY(!initialized))
+ {
+ initialized = true;
+ g_type_init();
+ }
+ }
+}
+
+/***
+****
+***/
+
+class IndicatorTest : public ::testing::Test
+{
+ protected:
+
+ IndicatorPowerDevice * ac_device;
+ IndicatorPowerDevice * battery_device;
+
+ virtual void SetUp()
+ {
+ ensure_glib_initialized ();
+
+ g_setenv( "GSETTINGS_SCHEMA_DIR", SCHEMA_DIR, TRUE);
+
+ ac_device = indicator_power_device_new (
+ "/org/freedesktop/UPower/devices/line_power_AC",
+ UP_DEVICE_KIND_LINE_POWER,
+ 0.0, UP_DEVICE_STATE_UNKNOWN, 0);
+
+ battery_device = indicator_power_device_new (
+ "/org/freedesktop/UPower/devices/battery_BAT0",
+ UP_DEVICE_KIND_BATTERY,
+ 52.871712, UP_DEVICE_STATE_DISCHARGING, 8834);
+ }
+
+ virtual void TearDown()
+ {
+ g_object_unref (battery_device);
+ g_object_unref (ac_device);
+ }
+
+ const char* GetAccessibleDesc (IndicatorPower * power) const
+ {
+ GList * entries = indicator_object_get_entries (INDICATOR_OBJECT(power));
+ g_assert (g_list_length(entries) == 1);
+ IndicatorObjectEntry * entry = static_cast<IndicatorObjectEntry*>(entries->data);
+ const char * ret = entry->accessible_desc;
+ g_list_free (entries);
+ return ret;
+ }
+};
+
+/***
+****
+***/
+
+TEST_F(IndicatorTest, GObjectNew)
+{
+ GObject * o = G_OBJECT (g_object_new (INDICATOR_POWER_TYPE, NULL));
+ ASSERT_TRUE (o != NULL);
+ ASSERT_TRUE (IS_INDICATOR_POWER(o));
+ g_object_run_dispose (o); // used to get coverage of both branches in the object's dispose func's g_clear_*() calls
+ g_object_unref (o);
+}
+
+TEST_F(IndicatorTest, SetDevices)
+{
+ GSList * devices;
+ IndicatorPower * power = INDICATOR_POWER(g_object_new (INDICATOR_POWER_TYPE, NULL));
+
+ devices = NULL;
+ devices = g_slist_append (devices, ac_device);
+ devices = g_slist_append (devices, battery_device);
+ indicator_power_set_devices (power, devices);
+ g_slist_free (devices);
+
+ g_object_unref (power);
+}
+
+TEST_F(IndicatorTest, DischargingStrings)
+{
+ IndicatorPower * power = INDICATOR_POWER(g_object_new (INDICATOR_POWER_TYPE, NULL));
+ GSList * devices = g_slist_append (NULL, battery_device);
+
+ // give the indicator a discharging battery with 30 minutes of life left
+ g_object_set (battery_device,
+ INDICATOR_POWER_DEVICE_STATE, UP_DEVICE_STATE_DISCHARGING,
+ INDICATOR_POWER_DEVICE_PERCENTAGE, 50.0,
+ INDICATOR_POWER_DEVICE_TIME, guint64(60*30),
+ NULL);
+ indicator_power_set_devices (power, devices);
+ ASSERT_STREQ (GetAccessibleDesc(power), "Battery (30 minutes left (50%))");
+
+ // give the indicator a discharging battery with 1 hour of life left
+ g_object_set (battery_device,
+ INDICATOR_POWER_DEVICE_STATE, UP_DEVICE_STATE_DISCHARGING,
+ INDICATOR_POWER_DEVICE_PERCENTAGE, 50.0,
+ INDICATOR_POWER_DEVICE_TIME, guint64(60*60),
+ NULL);
+ indicator_power_set_devices (power, devices);
+ ASSERT_STREQ (GetAccessibleDesc(power), "Battery (1 hour left (50%))");
+
+ // give the indicator a discharging battery with 2 hours of life left
+ g_object_set (battery_device,
+ INDICATOR_POWER_DEVICE_PERCENTAGE, 100.0,
+ INDICATOR_POWER_DEVICE_TIME, guint64(60*60*2),
+ NULL);
+ indicator_power_set_devices (power, devices);
+ ASSERT_STREQ (GetAccessibleDesc(power), "Battery (2 hours left (100%))");
+
+ // give the indicator a discharging battery with over 12 hours of life left
+ g_object_set (battery_device,
+ INDICATOR_POWER_DEVICE_TIME, guint64(60*60*12 + 1),
+ NULL);
+ indicator_power_set_devices (power, devices);
+ ASSERT_STREQ (GetAccessibleDesc(power), "Battery");
+
+ // give the indicator a discharging battery with 29 seconds left
+ g_object_set (battery_device,
+ INDICATOR_POWER_DEVICE_TIME, guint64(29),
+ NULL);
+ indicator_power_set_devices (power, devices);
+ ASSERT_STREQ (GetAccessibleDesc(power), "Battery (Unknown time left (100%))");
+
+ // what happens if the time estimate isn't available
+ g_object_set (battery_device,
+ INDICATOR_POWER_DEVICE_TIME, guint64(0),
+ INDICATOR_POWER_DEVICE_PERCENTAGE, 50.0,
+ NULL);
+ indicator_power_set_devices (power, devices);
+ ASSERT_STREQ (GetAccessibleDesc(power), "Battery (50%)");
+
+ // what happens if the time estimate AND percentage isn't available
+ g_object_set (battery_device,
+ INDICATOR_POWER_DEVICE_TIME, guint64(0),
+ INDICATOR_POWER_DEVICE_PERCENTAGE, 0.0,
+ NULL);
+ indicator_power_set_devices (power, devices);
+ ASSERT_STREQ (GetAccessibleDesc(power), "Battery (not present)");
+
+ // cleanup
+ g_slist_free (devices);
+ g_object_unref (power);
+}
+
+TEST_F(IndicatorTest, ChargingStrings)
+{
+ IndicatorPower * power = INDICATOR_POWER(g_object_new (INDICATOR_POWER_TYPE, NULL));
+ GSList * devices = g_slist_prepend (NULL, battery_device);
+
+ // give the indicator a discharging battery with 1 hour of life left
+ g_object_set (battery_device,
+ INDICATOR_POWER_DEVICE_STATE, UP_DEVICE_STATE_CHARGING,
+ INDICATOR_POWER_DEVICE_PERCENTAGE, 50.0,
+ INDICATOR_POWER_DEVICE_TIME, guint64(60*60),
+ NULL);
+ indicator_power_set_devices (power, devices);
+ ASSERT_STREQ (GetAccessibleDesc(power), "Battery (1 hour to charge (50%))");
+
+ // give the indicator a discharging battery with 2 hours of life left
+ g_object_set (battery_device,
+ INDICATOR_POWER_DEVICE_TIME, guint64(60*60*2),
+ NULL);
+ indicator_power_set_devices (power, devices);
+ ASSERT_STREQ (GetAccessibleDesc(power), "Battery (2 hours to charge (50%))");
+
+ // cleanup
+ g_slist_free (devices);
+ g_object_unref (power);
+}
+
+TEST_F(IndicatorTest, ChargedStrings)
+{
+ IndicatorPower * power = INDICATOR_POWER(g_object_new (INDICATOR_POWER_TYPE, NULL));
+ GSList * devices = g_slist_append (NULL, battery_device);
+
+ // give the indicator a discharging battery with 1 hour of life left
+ g_object_set (battery_device,
+ INDICATOR_POWER_DEVICE_STATE, UP_DEVICE_STATE_FULLY_CHARGED,
+ INDICATOR_POWER_DEVICE_PERCENTAGE, 100.0,
+ INDICATOR_POWER_DEVICE_TIME, guint64(0),
+ NULL);
+ indicator_power_set_devices (power, devices);
+ ASSERT_STREQ (GetAccessibleDesc(power), "Battery (charged)");
+
+ // cleanup
+ g_slist_free (devices);
+ g_object_unref (power);
+}
+
+TEST_F(IndicatorTest, AvoidChargingBatteriesWithZeroSecondsLeft)
+{
+ IndicatorPower * power = INDICATOR_POWER(g_object_new (INDICATOR_POWER_TYPE, NULL));
+
+ g_object_set (battery_device,
+ INDICATOR_POWER_DEVICE_STATE, UP_DEVICE_STATE_FULLY_CHARGED,
+ INDICATOR_POWER_DEVICE_PERCENTAGE, 100.0,
+ INDICATOR_POWER_DEVICE_TIME, guint64(0),
+ NULL);
+ IndicatorPowerDevice * bad_battery_device = indicator_power_device_new (
+ "/org/freedesktop/UPower/devices/battery_BAT0",
+ UP_DEVICE_KIND_BATTERY,
+ 53, UP_DEVICE_STATE_CHARGING, 0);
+
+ GSList * devices = NULL;
+ devices = g_slist_append (devices, battery_device);
+ devices = g_slist_append (devices, bad_battery_device);
+ indicator_power_set_devices (power, devices);
+ ASSERT_STREQ (GetAccessibleDesc(power), "Battery (53%)");
+
+ // cleanup
+ g_slist_free (devices);
+ g_object_unref (power);
+ g_object_unref (bad_battery_device);
+}
+
+TEST_F(IndicatorTest, OtherDevices)
+{
+ IndicatorPower * power = INDICATOR_POWER(g_object_new (INDICATOR_POWER_TYPE, NULL));
+
+ g_object_ref (battery_device);
+ GSList * devices = g_slist_append (NULL, battery_device);
+
+ devices = g_slist_append (devices, indicator_power_device_new (
+ "/org/freedesktop/UPower/devices/mouse", UP_DEVICE_KIND_MOUSE,
+ 0, UP_DEVICE_STATE_UNKNOWN, 0));
+ devices = g_slist_append (devices, indicator_power_device_new (
+ "/org/freedesktop/UPower/devices/ups", UP_DEVICE_KIND_UPS,
+ 0, UP_DEVICE_STATE_UNKNOWN, 0));
+ devices = g_slist_append (devices, indicator_power_device_new (
+ "/org/freedesktop/UPower/devices/keyboard", UP_DEVICE_KIND_KEYBOARD,
+ 0, UP_DEVICE_STATE_UNKNOWN, 0));
+ devices = g_slist_append (devices, indicator_power_device_new (
+ "/org/freedesktop/UPower/devices/pda", UP_DEVICE_KIND_PDA,
+ 0, UP_DEVICE_STATE_UNKNOWN, 0));
+ devices = g_slist_append (devices, indicator_power_device_new (
+ "/org/freedesktop/UPower/devices/phone", UP_DEVICE_KIND_PHONE,
+ 0, UP_DEVICE_STATE_UNKNOWN, 0));
+ devices = g_slist_append (devices, indicator_power_device_new (
+ "/org/freedesktop/UPower/devices/monitor", UP_DEVICE_KIND_MONITOR,
+ 0, UP_DEVICE_STATE_UNKNOWN, 0));
+ devices = g_slist_append (devices, indicator_power_device_new (
+ "/org/freedesktop/UPower/devices/media_player", UP_DEVICE_KIND_MEDIA_PLAYER,
+ 0, UP_DEVICE_STATE_UNKNOWN, 0));
+ devices = g_slist_append (devices, indicator_power_device_new (
+ "/org/freedesktop/UPower/devices/tablet", UP_DEVICE_KIND_TABLET,
+ 0, UP_DEVICE_STATE_UNKNOWN, 0));
+ devices = g_slist_append (devices, indicator_power_device_new (
+ "/org/freedesktop/UPower/devices/computer", UP_DEVICE_KIND_COMPUTER,
+ 0, UP_DEVICE_STATE_UNKNOWN, 0));
+ devices = g_slist_append (devices, indicator_power_device_new (
+ "/org/freedesktop/UPower/devices/unknown", UP_DEVICE_KIND_UNKNOWN,
+ 0, UP_DEVICE_STATE_UNKNOWN, 0));
+
+ indicator_power_set_devices (power, devices);
+
+ // FIXME: this tests to confirm the code doesn't crash,
+ // but further tests would be helpful
+
+ // cleanup
+ g_slist_free_full (devices, g_object_unref);
+ g_object_unref (power);
+}
+
+TEST_F(IndicatorTest, NoDevices)
+{
+ IndicatorPower * power = INDICATOR_POWER(g_object_new (INDICATOR_POWER_TYPE, NULL));
+
+ indicator_power_set_devices (power, NULL);
+
+ // FIXME: this tests to confirm the code doesn't crash,
+ // but further tests would be helpful
+
+ // cleanup
+ g_object_unref (power);
+}