2
* Copyright 2010 Canonical Ltd.
4
* This program is free software: you can redistribute it and/or modify it
5
* under the terms of the GNU General Public License version 3, as published
6
* by the Free Software Foundation.
8
* This program is distributed in the hope that it will be useful, but
9
* WITHOUT ANY WARRANTY; without even the implied warranties of
10
* MERCHANTABILITY, SATISFACTORY QUALITY or FITNESS FOR A PARTICULAR
11
* PURPOSE. See the GNU General Public License for more details.
13
* You should have received a copy of the GNU General Public License
14
* version 3 along with this program. If not, see
15
* <http://www.gnu.org/licenses/>
17
* Authored by: Neil Jagdish Patel <neil.patel@canonical.com>
24
#include "panel-service.h"
25
#include <libindicator/indicator-object.h>
27
//----------------------- TESTING INDICATOR STUFF -----------------------------
29
#define TEST_TYPE_OBJECT (test_object_get_type ())
31
#define TEST_OBJECT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj),\
32
TEST_TYPE_OBJECT, TestObject))
34
#define TEST_OBJECT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass),\
35
TEST_TYPE_OBJECT, TestObjectClass))
37
#define TEST_IS_OBJECT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj),\
40
#define TEST_IS_OBJECT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass),\
43
#define TEST_OBJECT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj),\
44
TEST_TYPE_OBJECT, TestObjectClass))
46
typedef struct _TestObject TestObject;
47
typedef struct _TestObjectClass TestObjectClass;
51
IndicatorObject parent;
56
struct _TestObjectClass
58
IndicatorObjectClass parent_class;
61
GType test_object_get_type(void) G_GNUC_CONST;
63
IndicatorObject* test_object_new();
65
IndicatorObjectEntry* test_object_add_entry(TestObject* self,
67
const gchar* icon_name);
71
G_DEFINE_TYPE(TestObject, test_object, INDICATOR_OBJECT_TYPE);
74
test_object_dispose(GObject* object)
76
TestObject* self = TEST_OBJECT(object);
79
for (e = self->entries; e; e = e->next)
81
g_slice_free(IndicatorObjectEntry, e->data);
83
g_list_free(self->entries);
86
G_OBJECT_CLASS(test_object_parent_class)->dispose(object);
90
test_object_get_entries(IndicatorObject* io)
92
g_return_val_if_fail(TEST_IS_OBJECT(io), NULL);
94
return g_list_copy(TEST_OBJECT(io)->entries);
98
test_object_get_location(IndicatorObject* io,
99
IndicatorObjectEntry* entry)
101
g_return_val_if_fail(TEST_IS_OBJECT(io), 0);
103
return g_list_index(TEST_OBJECT(io)->entries, entry);
107
test_object_entry_activate(IndicatorObject* io,
108
IndicatorObjectEntry* entry,
115
test_object_class_init(TestObjectClass* klass)
117
GObjectClass* obj_class = G_OBJECT_CLASS(klass);
118
IndicatorObjectClass* ind_class = INDICATOR_OBJECT_CLASS(klass);
120
obj_class->dispose = test_object_dispose;
122
ind_class->get_entries = test_object_get_entries;
123
ind_class->get_location = test_object_get_location;
124
ind_class->entry_activate = test_object_entry_activate;
128
test_object_init(TestObject* self)
136
return (IndicatorObject*)g_object_new(TEST_TYPE_OBJECT, NULL);
139
IndicatorObjectEntry*
140
test_object_add_entry(TestObject* self,
142
const gchar* icon_name)
144
IndicatorObjectEntry* entry;
145
g_return_val_if_fail(TEST_IS_OBJECT(self), NULL);
147
entry = g_slice_new0(IndicatorObjectEntry);
148
entry->label = (GtkLabel*)gtk_label_new(label);
149
entry->image = icon_name ? (GtkImage*)gtk_image_new_from_icon_name(icon_name,
150
GTK_ICON_SIZE_MENU) : NULL;
153
self->entries = g_list_append(self->entries, entry);
155
g_signal_emit(self, INDICATOR_OBJECT_SIGNAL_ENTRY_ADDED_ID, 0, entry, TRUE);
161
test_object_show_entry(TestObject* self,
162
IndicatorObjectEntry* entry,
165
g_signal_emit(self, INDICATOR_OBJECT_SIGNAL_MENU_SHOW_ID, 0, entry, timestamp);
168
//----------------------- /TESTING INDICATOR STUFF ----------------------------
170
//------------------------ USEFUL FUNCTIONS -----------------------------------
173
get_n_indicators_in_result(GVariant* result)
176
gchar* current_object_id = NULL;
181
gboolean label_sensitive;
182
gboolean label_visible;
185
gboolean image_sensitive;
186
gboolean image_visible;
188
g_variant_get(result, "(a(sssbbusbb))", &iter);
189
while (g_variant_iter_loop(iter, "(sssbbusbb)",
200
if (g_strcmp0(current_object_id, indicator_id) != 0)
203
g_free(current_object_id);
204
current_object_id = g_strdup(indicator_id);
207
g_free(current_object_id);
213
get_n_entries_in_result(GVariant* result)
221
gboolean label_sensitive;
222
gboolean label_visible;
225
gboolean image_sensitive;
226
gboolean image_visible;
229
g_variant_get(result, "(a(ssssbbusbbi))", &iter);
230
while (g_variant_iter_loop(iter, "(ssssbbusbbi)",
243
if (g_strcmp0(entry_id, "") != 0)
252
//------------------------ /USEFUL FUNCTIONS ----------------------------------
254
static void TestAllocation(void);
255
static void TestIndicatorLoading(void);
256
static void TestEmptyIndicatorObject(void);
257
static void TestEntryAddition(void);
258
static void TestEntryActivateRequest(void);
261
TestPanelServiceCreateSuite()
263
#define _DOMAIN "/Unit/PanelService"
265
g_test_add_func(_DOMAIN"/Allocation", TestAllocation);
266
g_test_add_func(_DOMAIN"/IndicatorLoading", TestIndicatorLoading);
267
g_test_add_func(_DOMAIN"/EmptyIndicatorObject", TestEmptyIndicatorObject);
268
g_test_add_func(_DOMAIN"/EntryAddition", TestEntryAddition);
269
g_test_add_func(_DOMAIN"/EntryActivateRequest", TestEntryActivateRequest);
275
PanelService* service;
277
service = panel_service_get_default();
278
g_assert(PANEL_IS_SERVICE(service));
280
g_object_unref(service);
281
g_assert(PANEL_IS_SERVICE(service) == FALSE);
285
TestIndicatorLoading()
287
PanelService* service;
288
IndicatorObject* object;
289
GList* objects = NULL;
291
object = test_object_new();
292
g_assert(INDICATOR_IS_OBJECT(object));
293
objects = g_list_append(objects, object);
295
service = panel_service_get_default_with_indicators(objects);
296
g_assert(PANEL_IS_SERVICE(service));
298
g_assert_cmpint(panel_service_get_n_indicators(service), == , 1);
300
g_list_free(objects);
301
g_object_unref(object);
302
g_object_unref(service);
306
TestEmptyIndicatorObject()
308
PanelService* service;
309
IndicatorObject* object;
310
GList* objects = NULL;
313
object = test_object_new();
314
g_assert(INDICATOR_IS_OBJECT(object));
315
objects = g_list_append(objects, object);
317
service = panel_service_get_default_with_indicators(objects);
318
g_assert(PANEL_IS_SERVICE(service));
320
g_assert_cmpint(panel_service_get_n_indicators(service), == , 1);
322
result = panel_service_sync(service);
323
g_assert(result != NULL);
325
g_assert_cmpint(get_n_indicators_in_result(result), == , 1);
327
g_variant_unref(result);
328
g_list_free(objects);
329
g_object_unref(object);
330
g_object_unref(service);
336
PanelService* service;
338
GList* objects = NULL;
342
object = (TestObject*)test_object_new();
343
test_object_add_entry(object, "Hello", "gtk-apply");
344
g_assert(INDICATOR_IS_OBJECT(object));
345
objects = g_list_append(objects, object);
347
service = panel_service_get_default_with_indicators(objects);
348
g_assert(PANEL_IS_SERVICE(service));
350
result = panel_service_sync(service);
351
g_assert(result != NULL);
352
g_assert_cmpint(get_n_entries_in_result(result), == , 1);
354
for (i = 2; i < 10; i++)
356
g_variant_unref(result);
358
test_object_add_entry(object, "Bye", "gtk-forward");
359
result = panel_service_sync(service);
360
g_assert_cmpint(get_n_entries_in_result(result), == , i);
363
g_variant_unref(result);
364
g_list_free(objects);
365
g_object_unref(object);
366
g_object_unref(service);
370
OnEntryActivateRequest(IndicatorObject* object,
371
const gchar* entry_id,
372
const gchar* entry_id_should_be)
374
g_assert_cmpstr(entry_id, == , entry_id_should_be);
378
TestEntryActivateRequest()
380
PanelService* service;
382
GList* objects = NULL;
383
IndicatorObjectEntry* entry;
386
object = (TestObject*)test_object_new();
387
entry = test_object_add_entry(object, "Hello", "gtk-apply");
388
id = g_strdup_printf("%p", entry);
389
g_assert(INDICATOR_IS_OBJECT(object));
390
objects = g_list_append(objects, object);
392
service = panel_service_get_default_with_indicators(objects);
393
g_assert(PANEL_IS_SERVICE(service));
395
g_signal_connect(service, "entry-activate-request",
396
G_CALLBACK(OnEntryActivateRequest),
399
test_object_show_entry(object, entry, 1234);
402
g_list_free(objects);
403
g_object_unref(object);
404
g_object_unref(service);