]> Pileus Git - ~andy/gtk/blob - gtk/tests/recentmanager.c
Change FSF Address
[~andy/gtk] / gtk / tests / recentmanager.c
1 /* GTK - The GIMP Toolkit
2  * gtkrecentmanager.c: a manager for the recently used resources
3  *
4  * Copyright (C) 2006 Emmanuele Bassi
5  *
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.
10  *
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.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library. If not, see <http://www.gnu.org/licenses/>.
18  */
19
20 #include <glib/gstdio.h>
21 #include <gtk/gtk.h>
22
23 const gchar *uri = "file:///tmp/testrecentchooser.txt";
24 const gchar *uri2 = "file:///tmp/testrecentchooser2.txt";
25
26 static void
27 recent_manager_get_default (void)
28 {
29   GtkRecentManager *manager;
30   GtkRecentManager *manager2;
31
32   manager = gtk_recent_manager_get_default ();
33   g_assert (manager != NULL);
34
35   manager2 = gtk_recent_manager_get_default ();
36   g_assert (manager == manager2);
37 }
38
39 static void
40 recent_manager_add (void)
41 {
42   GtkRecentManager *manager;
43   GtkRecentData *recent_data;
44   gboolean res;
45
46   manager = gtk_recent_manager_get_default ();
47
48   recent_data = g_slice_new0 (GtkRecentData);
49
50   /* mime type is mandatory */
51   recent_data->mime_type = NULL;
52   recent_data->app_name = "testrecentchooser";
53   recent_data->app_exec = "testrecentchooser %u";
54   if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDERR))
55     {
56       res = gtk_recent_manager_add_full (manager,
57                                          uri,
58                                          recent_data);
59     }
60   g_test_trap_assert_failed ();
61
62   /* app name is mandatory */
63   recent_data->mime_type = "text/plain";
64   recent_data->app_name = NULL;
65   recent_data->app_exec = "testrecentchooser %u";
66   if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDERR))
67     {
68       res = gtk_recent_manager_add_full (manager,
69                                          uri,
70                                          recent_data);
71     }
72   g_test_trap_assert_failed ();
73
74   /* app exec is mandatory */
75   recent_data->mime_type = "text/plain";
76   recent_data->app_name = "testrecentchooser";
77   recent_data->app_exec = NULL;
78   if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDERR))
79     {
80       res = gtk_recent_manager_add_full (manager,
81                                          uri,
82                                          recent_data);
83     }
84   g_test_trap_assert_failed ();
85
86   recent_data->mime_type = "text/plain";
87   recent_data->app_name = "testrecentchooser";
88   recent_data->app_exec = "testrecentchooser %u";
89   res = gtk_recent_manager_add_full (manager,
90                                      uri,
91                                      recent_data);
92   g_assert (res == TRUE);
93
94   g_slice_free (GtkRecentData, recent_data);
95 }
96
97 typedef struct {
98   GMainLoop *main_loop;
99   gint counter;
100 } AddManyClosure;
101
102 static void
103 check_bulk (GtkRecentManager *manager,
104             gpointer          data)
105 {
106   AddManyClosure *closure = data;
107
108   if (g_test_verbose ())
109     g_print (G_STRLOC ": counter = %d\n", closure->counter);
110
111   g_assert_cmpint (closure->counter, ==, 100);
112
113   if (g_main_loop_is_running (closure->main_loop))
114     g_main_loop_quit (closure->main_loop);
115 }
116
117 static void
118 recent_manager_add_many (void)
119 {
120   GtkRecentManager *manager = g_object_new (GTK_TYPE_RECENT_MANAGER,
121                                             "filename", "recently-used.xbel",
122                                             NULL);
123   AddManyClosure *closure = g_new (AddManyClosure, 1);
124   GtkRecentData *data = g_slice_new0 (GtkRecentData);
125   gint i;
126
127   closure->main_loop = g_main_loop_new (NULL, FALSE);
128   closure->counter = 0;
129
130   g_signal_connect (manager, "changed", G_CALLBACK (check_bulk), closure);
131
132   for (i = 0; i < 100; i++)
133     {
134       gchar *new_uri;
135
136       data->mime_type = "text/plain";
137       data->app_name = "testrecentchooser";
138       data->app_exec = "testrecentchooser %u";
139
140       if (g_test_verbose ())
141         g_print (G_STRLOC ": adding item %d\n", i);
142
143       new_uri = g_strdup_printf ("file:///doesnotexist-%d.txt", i);
144       gtk_recent_manager_add_full (manager, new_uri, data);
145       g_free (new_uri);
146
147       closure->counter += 1;
148     }
149
150   g_main_loop_run (closure->main_loop);
151
152   g_main_loop_unref (closure->main_loop);
153   g_slice_free (GtkRecentData, data);
154   g_free (closure);
155   g_object_unref (manager);
156
157   g_assert_cmpint (g_unlink ("recently-used.xbel"), ==, 0);
158 }
159
160 static void
161 recent_manager_has_item (void)
162 {
163   GtkRecentManager *manager;
164   gboolean res;
165
166   manager = gtk_recent_manager_get_default ();
167
168   res = gtk_recent_manager_has_item (manager, "file:///tmp/testrecentdoesnotexist.txt");
169   g_assert (res == FALSE);
170
171   res = gtk_recent_manager_has_item (manager, uri);
172   g_assert (res == TRUE);
173 }
174
175 static void
176 recent_manager_move_item (void)
177 {
178   GtkRecentManager *manager;
179   gboolean res;
180   GError *error;
181
182   manager = gtk_recent_manager_get_default ();
183
184   error = NULL;
185   res = gtk_recent_manager_move_item (manager,
186                                       "file:///tmp/testrecentdoesnotexist.txt",
187                                       uri2,
188                                       &error);
189   g_assert (res == FALSE);
190   g_assert (error != NULL);
191   g_assert (error->domain == GTK_RECENT_MANAGER_ERROR);
192   g_assert (error->code == GTK_RECENT_MANAGER_ERROR_NOT_FOUND);
193   g_error_free (error);
194
195   error = NULL;
196   res = gtk_recent_manager_move_item (manager, uri, uri2, &error);
197   g_assert (res == TRUE);
198   g_assert (error == NULL);
199
200   res = gtk_recent_manager_has_item (manager, uri);
201   g_assert (res == FALSE);
202
203   res = gtk_recent_manager_has_item (manager, uri2);
204   g_assert (res == TRUE);
205 }
206
207 static void
208 recent_manager_lookup_item (void)
209 {
210   GtkRecentManager *manager;
211   GtkRecentInfo *info;
212   GError *error;
213
214   manager = gtk_recent_manager_get_default ();
215
216   error = NULL;
217   info = gtk_recent_manager_lookup_item (manager,
218                                          "file:///tmp/testrecentdoesnotexist.txt",
219                                          &error);
220   g_assert (info == NULL);
221   g_assert (error != NULL);
222   g_assert (error->domain == GTK_RECENT_MANAGER_ERROR);
223   g_assert (error->code == GTK_RECENT_MANAGER_ERROR_NOT_FOUND);
224   g_error_free (error);
225
226   error = NULL;
227   info = gtk_recent_manager_lookup_item (manager, uri2, &error);
228   g_assert (info != NULL);
229   g_assert (error == NULL);
230
231   g_assert (gtk_recent_info_has_application (info, "testrecentchooser"));
232
233   gtk_recent_info_unref (info);
234 }
235
236 static void
237 recent_manager_remove_item (void)
238 {
239   GtkRecentManager *manager;
240   gboolean res;
241   GError *error;
242
243   manager = gtk_recent_manager_get_default ();
244
245   error = NULL;
246   res = gtk_recent_manager_remove_item (manager,
247                                         "file:///tmp/testrecentdoesnotexist.txt",
248                                         &error);
249   g_assert (res == FALSE);
250   g_assert (error != NULL);
251   g_assert (error->domain == GTK_RECENT_MANAGER_ERROR);
252   g_assert (error->code == GTK_RECENT_MANAGER_ERROR_NOT_FOUND);
253   g_error_free (error);
254
255   /* remove an item that's actually there */
256   error = NULL;
257   res = gtk_recent_manager_remove_item (manager, uri2, &error);
258   g_assert (res == TRUE);
259   g_assert (error == NULL);
260
261   res = gtk_recent_manager_has_item (manager, uri2);
262   g_assert (res == FALSE);
263 }
264
265 static void
266 recent_manager_purge (void)
267 {
268   GtkRecentManager *manager;
269   GtkRecentData *recent_data;
270   gint n;
271   GError *error;
272
273   manager = gtk_recent_manager_get_default ();
274
275   /* purge, add 1, purge again and check that 1 item has been purged */
276   error = NULL;
277   n = gtk_recent_manager_purge_items (manager, &error);
278   g_assert (error == NULL);
279
280   recent_data = g_slice_new0 (GtkRecentData);
281   recent_data->mime_type = "text/plain";
282   recent_data->app_name = "testrecentchooser";
283   recent_data->app_exec = "testrecentchooser %u";
284   gtk_recent_manager_add_full (manager, uri, recent_data);
285   g_slice_free (GtkRecentData, recent_data);
286
287   error = NULL;
288   n = gtk_recent_manager_purge_items (manager, &error);
289   g_assert (error == NULL);
290   g_assert (n == 1);
291 }
292
293 int
294 main (int    argc,
295       char **argv)
296 {
297   gtk_test_init (&argc, &argv, NULL);
298
299   g_test_add_func ("/recent-manager/get-default", recent_manager_get_default);
300   g_test_add_func ("/recent-manager/add", recent_manager_add);
301   g_test_add_func ("/recent-manager/add-many", recent_manager_add_many);
302   g_test_add_func ("/recent-manager/has-item", recent_manager_has_item);
303   g_test_add_func ("/recent-manager/move-item", recent_manager_move_item);
304   g_test_add_func ("/recent-manager/lookup-item", recent_manager_lookup_item);
305   g_test_add_func ("/recent-manager/remove-item", recent_manager_remove_item);
306   g_test_add_func ("/recent-manager/purge", recent_manager_purge);
307
308   return g_test_run ();
309 }