1 /* GTK - The GIMP Toolkit
2 * gtkrecentmanager.c: a manager for the recently used resources
4 * Copyright (C) 2006 Emmanuele Bassi
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the
18 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 * Boston, MA 02111-1307, USA.
22 #include <glib/gstdio.h>
25 const gchar *uri = "file:///tmp/testrecentchooser.txt";
26 const gchar *uri2 = "file:///tmp/testrecentchooser2.txt";
29 recent_manager_get_default (void)
31 GtkRecentManager *manager;
32 GtkRecentManager *manager2;
34 manager = gtk_recent_manager_get_default ();
35 g_assert (manager != NULL);
37 manager2 = gtk_recent_manager_get_default ();
38 g_assert (manager == manager2);
42 recent_manager_add (void)
44 GtkRecentManager *manager;
45 GtkRecentData *recent_data;
48 manager = gtk_recent_manager_get_default ();
50 recent_data = g_slice_new0 (GtkRecentData);
52 /* mime type is mandatory */
53 recent_data->mime_type = NULL;
54 recent_data->app_name = "testrecentchooser";
55 recent_data->app_exec = "testrecentchooser %u";
56 if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDERR))
58 res = gtk_recent_manager_add_full (manager,
62 g_test_trap_assert_failed ();
64 /* app name is mandatory */
65 recent_data->mime_type = "text/plain";
66 recent_data->app_name = NULL;
67 recent_data->app_exec = "testrecentchooser %u";
68 if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDERR))
70 res = gtk_recent_manager_add_full (manager,
74 g_test_trap_assert_failed ();
76 /* app exec is mandatory */
77 recent_data->mime_type = "text/plain";
78 recent_data->app_name = "testrecentchooser";
79 recent_data->app_exec = NULL;
80 if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDERR))
82 res = gtk_recent_manager_add_full (manager,
86 g_test_trap_assert_failed ();
88 recent_data->mime_type = "text/plain";
89 recent_data->app_name = "testrecentchooser";
90 recent_data->app_exec = "testrecentchooser %u";
91 res = gtk_recent_manager_add_full (manager,
94 g_assert (res == TRUE);
96 g_slice_free (GtkRecentData, recent_data);
100 GMainLoop *main_loop;
105 check_bulk (GtkRecentManager *manager,
108 AddManyClosure *closure = data;
110 if (g_test_verbose ())
111 g_print (G_STRLOC ": counter = %d\n", closure->counter);
113 g_assert_cmpint (closure->counter, ==, 100);
115 if (g_main_loop_is_running (closure->main_loop))
116 g_main_loop_quit (closure->main_loop);
120 recent_manager_add_many (void)
122 GtkRecentManager *manager = g_object_new (GTK_TYPE_RECENT_MANAGER,
123 "filename", "recently-used.xbel",
125 AddManyClosure *closure = g_new (AddManyClosure, 1);
126 GtkRecentData *data = g_slice_new0 (GtkRecentData);
129 closure->main_loop = g_main_loop_new (NULL, FALSE);
130 closure->counter = 0;
132 g_signal_connect (manager, "changed", G_CALLBACK (check_bulk), closure);
134 for (i = 0; i < 100; i++)
138 data->mime_type = "text/plain";
139 data->app_name = "testrecentchooser";
140 data->app_exec = "testrecentchooser %u";
142 if (g_test_verbose ())
143 g_print (G_STRLOC ": adding item %d\n", i);
145 new_uri = g_strdup_printf ("file:///doesnotexist-%d.txt", i);
146 gtk_recent_manager_add_full (manager, new_uri, data);
149 closure->counter += 1;
152 g_main_loop_run (closure->main_loop);
154 g_main_loop_unref (closure->main_loop);
155 g_slice_free (GtkRecentData, data);
157 g_object_unref (manager);
159 g_assert_cmpint (g_unlink ("recently-used.xbel"), ==, 0);
163 recent_manager_has_item (void)
165 GtkRecentManager *manager;
168 manager = gtk_recent_manager_get_default ();
170 res = gtk_recent_manager_has_item (manager, "file:///tmp/testrecentdoesnotexist.txt");
171 g_assert (res == FALSE);
173 res = gtk_recent_manager_has_item (manager, uri);
174 g_assert (res == TRUE);
178 recent_manager_move_item (void)
180 GtkRecentManager *manager;
184 manager = gtk_recent_manager_get_default ();
187 res = gtk_recent_manager_move_item (manager,
188 "file:///tmp/testrecentdoesnotexist.txt",
191 g_assert (res == FALSE);
192 g_assert (error != NULL);
193 g_assert (error->domain == GTK_RECENT_MANAGER_ERROR);
194 g_assert (error->code == GTK_RECENT_MANAGER_ERROR_NOT_FOUND);
195 g_error_free (error);
198 res = gtk_recent_manager_move_item (manager, uri, uri2, &error);
199 g_assert (res == TRUE);
200 g_assert (error == NULL);
202 res = gtk_recent_manager_has_item (manager, uri);
203 g_assert (res == FALSE);
205 res = gtk_recent_manager_has_item (manager, uri2);
206 g_assert (res == TRUE);
210 recent_manager_lookup_item (void)
212 GtkRecentManager *manager;
216 manager = gtk_recent_manager_get_default ();
219 info = gtk_recent_manager_lookup_item (manager,
220 "file:///tmp/testrecentdoesnotexist.txt",
222 g_assert (info == NULL);
223 g_assert (error != NULL);
224 g_assert (error->domain == GTK_RECENT_MANAGER_ERROR);
225 g_assert (error->code == GTK_RECENT_MANAGER_ERROR_NOT_FOUND);
226 g_error_free (error);
229 info = gtk_recent_manager_lookup_item (manager, uri2, &error);
230 g_assert (info != NULL);
231 g_assert (error == NULL);
233 g_assert (gtk_recent_info_has_application (info, "testrecentchooser"));
235 gtk_recent_info_unref (info);
239 recent_manager_remove_item (void)
241 GtkRecentManager *manager;
245 manager = gtk_recent_manager_get_default ();
248 res = gtk_recent_manager_remove_item (manager,
249 "file:///tmp/testrecentdoesnotexist.txt",
251 g_assert (res == FALSE);
252 g_assert (error != NULL);
253 g_assert (error->domain == GTK_RECENT_MANAGER_ERROR);
254 g_assert (error->code == GTK_RECENT_MANAGER_ERROR_NOT_FOUND);
255 g_error_free (error);
257 /* remove an item that's actually there */
259 res = gtk_recent_manager_remove_item (manager, uri2, &error);
260 g_assert (res == TRUE);
261 g_assert (error == NULL);
263 res = gtk_recent_manager_has_item (manager, uri2);
264 g_assert (res == FALSE);
268 recent_manager_purge (void)
270 GtkRecentManager *manager;
271 GtkRecentData *recent_data;
275 manager = gtk_recent_manager_get_default ();
277 /* purge, add 1, purge again and check that 1 item has been purged */
279 n = gtk_recent_manager_purge_items (manager, &error);
280 g_assert (error == NULL);
282 recent_data = g_slice_new0 (GtkRecentData);
283 recent_data->mime_type = "text/plain";
284 recent_data->app_name = "testrecentchooser";
285 recent_data->app_exec = "testrecentchooser %u";
286 gtk_recent_manager_add_full (manager, uri, recent_data);
287 g_slice_free (GtkRecentData, recent_data);
290 n = gtk_recent_manager_purge_items (manager, &error);
291 g_assert (error == NULL);
299 gtk_test_init (&argc, &argv, NULL);
301 g_test_add_func ("/recent-manager/get-default", recent_manager_get_default);
302 g_test_add_func ("/recent-manager/add", recent_manager_add);
303 g_test_add_func ("/recent-manager/add-many", recent_manager_add_many);
304 g_test_add_func ("/recent-manager/has-item", recent_manager_has_item);
305 g_test_add_func ("/recent-manager/move-item", recent_manager_move_item);
306 g_test_add_func ("/recent-manager/lookup-item", recent_manager_lookup_item);
307 g_test_add_func ("/recent-manager/remove-item", recent_manager_remove_item);
308 g_test_add_func ("/recent-manager/purge", recent_manager_purge);
310 return g_test_run ();