]> Pileus Git - ~andy/gtk/blob - gtk/tests/recentmanager.c
Add headers to treemodel test sources
[~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, write to the
18  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19  * Boston, MA 02111-1307, USA.
20  */
21
22 #include <glib/gstdio.h>
23 #include <gtk/gtk.h>
24
25 const gchar *uri = "file:///tmp/testrecentchooser.txt";
26 const gchar *uri2 = "file:///tmp/testrecentchooser2.txt";
27
28 static void
29 recent_manager_get_default (void)
30 {
31   GtkRecentManager *manager;
32   GtkRecentManager *manager2;
33
34   manager = gtk_recent_manager_get_default ();
35   g_assert (manager != NULL);
36
37   manager2 = gtk_recent_manager_get_default ();
38   g_assert (manager == manager2);
39 }
40
41 static void
42 recent_manager_add (void)
43 {
44   GtkRecentManager *manager;
45   GtkRecentData *recent_data;
46   gboolean res;
47
48   manager = gtk_recent_manager_get_default ();
49
50   recent_data = g_slice_new0 (GtkRecentData);
51
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))
57     {
58       res = gtk_recent_manager_add_full (manager,
59                                          uri,
60                                          recent_data);
61     }
62   g_test_trap_assert_failed ();
63
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))
69     {
70       res = gtk_recent_manager_add_full (manager,
71                                          uri,
72                                          recent_data);
73     }
74   g_test_trap_assert_failed ();
75
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))
81     {
82       res = gtk_recent_manager_add_full (manager,
83                                          uri,
84                                          recent_data);
85     }
86   g_test_trap_assert_failed ();
87
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,
92                                      uri,
93                                      recent_data);
94   g_assert (res == TRUE);
95
96   g_slice_free (GtkRecentData, recent_data);
97 }
98
99 typedef struct {
100   GMainLoop *main_loop;
101   gint counter;
102 } AddManyClosure;
103
104 static void
105 check_bulk (GtkRecentManager *manager,
106             gpointer          data)
107 {
108   AddManyClosure *closure = data;
109
110   if (g_test_verbose ())
111     g_print (G_STRLOC ": counter = %d\n", closure->counter);
112
113   g_assert_cmpint (closure->counter, ==, 100);
114
115   if (g_main_loop_is_running (closure->main_loop))
116     g_main_loop_quit (closure->main_loop);
117 }
118
119 static void
120 recent_manager_add_many (void)
121 {
122   GtkRecentManager *manager = g_object_new (GTK_TYPE_RECENT_MANAGER,
123                                             "filename", "recently-used.xbel",
124                                             NULL);
125   AddManyClosure *closure = g_new (AddManyClosure, 1);
126   GtkRecentData *data = g_slice_new0 (GtkRecentData);
127   gint i;
128
129   closure->main_loop = g_main_loop_new (NULL, FALSE);
130   closure->counter = 0;
131
132   g_signal_connect (manager, "changed", G_CALLBACK (check_bulk), closure);
133
134   for (i = 0; i < 100; i++)
135     {
136       gchar *new_uri;
137
138       data->mime_type = "text/plain";
139       data->app_name = "testrecentchooser";
140       data->app_exec = "testrecentchooser %u";
141
142       if (g_test_verbose ())
143         g_print (G_STRLOC ": adding item %d\n", i);
144
145       new_uri = g_strdup_printf ("file:///doesnotexist-%d.txt", i);
146       gtk_recent_manager_add_full (manager, new_uri, data);
147       g_free (new_uri);
148
149       closure->counter += 1;
150     }
151
152   g_main_loop_run (closure->main_loop);
153
154   g_main_loop_unref (closure->main_loop);
155   g_slice_free (GtkRecentData, data);
156   g_free (closure);
157   g_object_unref (manager);
158
159   g_assert_cmpint (g_unlink ("recently-used.xbel"), ==, 0);
160 }
161
162 static void
163 recent_manager_has_item (void)
164 {
165   GtkRecentManager *manager;
166   gboolean res;
167
168   manager = gtk_recent_manager_get_default ();
169
170   res = gtk_recent_manager_has_item (manager, "file:///tmp/testrecentdoesnotexist.txt");
171   g_assert (res == FALSE);
172
173   res = gtk_recent_manager_has_item (manager, uri);
174   g_assert (res == TRUE);
175 }
176
177 static void
178 recent_manager_move_item (void)
179 {
180   GtkRecentManager *manager;
181   gboolean res;
182   GError *error;
183
184   manager = gtk_recent_manager_get_default ();
185
186   error = NULL;
187   res = gtk_recent_manager_move_item (manager,
188                                       "file:///tmp/testrecentdoesnotexist.txt",
189                                       uri2,
190                                       &error);
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);
196
197   error = NULL;
198   res = gtk_recent_manager_move_item (manager, uri, uri2, &error);
199   g_assert (res == TRUE);
200   g_assert (error == NULL);
201
202   res = gtk_recent_manager_has_item (manager, uri);
203   g_assert (res == FALSE);
204
205   res = gtk_recent_manager_has_item (manager, uri2);
206   g_assert (res == TRUE);
207 }
208
209 static void
210 recent_manager_lookup_item (void)
211 {
212   GtkRecentManager *manager;
213   GtkRecentInfo *info;
214   GError *error;
215
216   manager = gtk_recent_manager_get_default ();
217
218   error = NULL;
219   info = gtk_recent_manager_lookup_item (manager,
220                                          "file:///tmp/testrecentdoesnotexist.txt",
221                                          &error);
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);
227
228   error = NULL;
229   info = gtk_recent_manager_lookup_item (manager, uri2, &error);
230   g_assert (info != NULL);
231   g_assert (error == NULL);
232
233   g_assert (gtk_recent_info_has_application (info, "testrecentchooser"));
234
235   gtk_recent_info_unref (info);
236 }
237
238 static void
239 recent_manager_remove_item (void)
240 {
241   GtkRecentManager *manager;
242   gboolean res;
243   GError *error;
244
245   manager = gtk_recent_manager_get_default ();
246
247   error = NULL;
248   res = gtk_recent_manager_remove_item (manager,
249                                         "file:///tmp/testrecentdoesnotexist.txt",
250                                         &error);
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);
256
257   /* remove an item that's actually there */
258   error = NULL;
259   res = gtk_recent_manager_remove_item (manager, uri2, &error);
260   g_assert (res == TRUE);
261   g_assert (error == NULL);
262
263   res = gtk_recent_manager_has_item (manager, uri2);
264   g_assert (res == FALSE);
265 }
266
267 static void
268 recent_manager_purge (void)
269 {
270   GtkRecentManager *manager;
271   GtkRecentData *recent_data;
272   gint n;
273   GError *error;
274
275   manager = gtk_recent_manager_get_default ();
276
277   /* purge, add 1, purge again and check that 1 item has been purged */
278   error = NULL;
279   n = gtk_recent_manager_purge_items (manager, &error);
280   g_assert (error == NULL);
281
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);
288
289   error = NULL;
290   n = gtk_recent_manager_purge_items (manager, &error);
291   g_assert (error == NULL);
292   g_assert (n == 1);
293 }
294
295 int
296 main (int    argc,
297       char **argv)
298 {
299   gtk_test_init (&argc, &argv, NULL);
300
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);
309
310   return g_test_run ();
311 }