]> Pileus Git - ~andy/gtk/blob - gtk/tests/filechooser.c
8aa59937930f0168daf4e4765808a1f018a597e9
[~andy/gtk] / gtk / tests / filechooser.c
1 /* GTK - The GIMP Toolkit
2  * autotestfilechooser.c: Automated unit tests for the GtkFileChooser widget
3  * Copyright (C) 2005, Novell, Inc.
4  *
5  * Authors:
6  *   Federico Mena-Quintero <federico@novell.com>
7  *
8  * This library is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Lesser General Public
10  * License as published by the Free Software Foundation; either
11  * version 2 of the License, or (at your option) any later version.
12  *
13  * This library is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16  * Lesser General Public License for more details.
17  *
18  * You should have received a copy of the GNU Lesser General Public
19  * License along with this library. If not, see <http://www.gnu.org/licenses/>.
20  */
21
22 /* TODO:
23  *
24  * - In test_reload_sequence(), test that the selection is preserved properly
25  *   between unmap/map.
26  *
27  * - More tests!
28  */
29
30 #define SLEEP_DURATION  100
31
32 #include "config.h"
33 #include <string.h>
34 #include <glib/gprintf.h>
35 #include <gtk/gtk.h>
36 #include "gtk/gtkfilechooserprivate.h"
37 #include "gtk/gtkfilechooserdefault.h"
38 #include "gtk/gtkfilechooserentry.h"
39
40 #ifdef BROKEN_TESTS
41 static void
42 log_test (gboolean passed, const char *test_name, ...)
43 {
44   va_list args;
45   char *str;
46
47   va_start (args, test_name);
48   str = g_strdup_vprintf (test_name, args);
49   va_end (args);
50
51   if (g_test_verbose())
52     g_printf ("%s: %s\n", passed ? "PASSED" : "FAILED", str);
53   g_free (str);
54 }
55
56 static const char *get_action_name (GtkFileChooserAction action);
57
58 typedef void (* SetFilenameFn) (GtkFileChooser *chooser, gpointer data);
59 typedef void (* CompareFilenameFn) (GtkFileChooser *chooser, gpointer data);
60
61 struct test_set_filename_closure {
62   GtkWidget *chooser;
63   GtkWidget *accept_button;
64   gboolean focus_button;
65 };
66
67 static gboolean
68 set_filename_timeout_cb (gpointer data)
69 {
70   struct test_set_filename_closure *closure;
71
72   closure = data;
73
74   if (closure->focus_button)
75     gtk_widget_grab_focus (closure->accept_button);
76
77   gtk_button_clicked (GTK_BUTTON (closure->accept_button));
78
79   return FALSE;
80 }
81 #endif
82
83
84 static guint wait_for_idle_id = 0;
85
86 static gboolean
87 wait_for_idle_idle (gpointer data)
88 {
89   wait_for_idle_id = 0;
90
91   return G_SOURCE_REMOVE;
92 }
93
94 static void
95 wait_for_idle (void)
96 {
97   wait_for_idle_id = g_idle_add_full (G_PRIORITY_LOW + 100,
98                                       wait_for_idle_idle,
99                                       NULL, NULL);
100
101   while (wait_for_idle_id)
102     gtk_main_iteration ();
103 }
104
105 #ifdef BROKEN_TESTS
106 static void
107 test_set_filename (GtkFileChooserAction action,
108                    gboolean focus_button,
109                    SetFilenameFn set_filename_fn,const
110                    CompareFilenameFn compare_filename_fn,
111                    gpointer data)
112 {
113   GtkWidget *chooser;
114   struct test_set_filename_closure closure;
115
116   chooser = gtk_file_chooser_dialog_new ("hello", NULL, action,
117                                          GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
118                                          NULL);
119
120   closure.chooser = chooser;
121   closure.accept_button = gtk_dialog_add_button (GTK_DIALOG (chooser), GTK_STOCK_OK, GTK_RESPONSE_ACCEPT);
122   closure.focus_button = focus_button;
123
124   gtk_dialog_set_default_response (GTK_DIALOG (chooser), GTK_RESPONSE_ACCEPT);
125
126   (* set_filename_fn) (GTK_FILE_CHOOSER (chooser), data);
127
128   gdk_threads_add_timeout_full (G_MAXINT, SLEEP_DURATION, set_filename_timeout_cb, &closure, NULL);
129   gtk_dialog_run (GTK_DIALOG (chooser));
130
131   (* compare_filename_fn) (GTK_FILE_CHOOSER (chooser), data);
132
133   gtk_widget_destroy (chooser);
134 }
135
136 static void
137 set_filename_cb (GtkFileChooser *chooser, gpointer data)
138 {
139   const char *filename;
140
141   filename = data;
142   gtk_file_chooser_set_filename (chooser, filename);
143 }
144
145 static void
146 compare_filename_cb (GtkFileChooser *chooser, gpointer data)
147 {
148   const char *filename;
149   char *out_filename;
150
151   filename = data;
152   out_filename = gtk_file_chooser_get_filename (chooser);
153
154   g_assert_cmpstr (out_filename, ==, filename);
155
156   if (out_filename)
157     g_free (out_filename);
158 }
159
160 typedef struct
161 {
162   const char *test_name;
163   GtkFileChooserAction action;
164   const char *filename;
165   gboolean focus_button;
166 } TestSetFilenameSetup;
167
168 static void
169 test_black_box_set_filename (gconstpointer data)
170 {
171   const TestSetFilenameSetup *setup = data;
172
173   test_set_filename (setup->action, setup->focus_button, set_filename_cb, compare_filename_cb, (char *) setup->filename);
174 }
175
176 struct current_name_closure {
177         const char *path;
178         const char *current_name;
179 };
180
181 static void
182 set_current_name_cb (GtkFileChooser *chooser, gpointer data)
183 {
184   struct current_name_closure *closure;
185
186   closure = data;
187
188   gtk_file_chooser_set_current_folder (chooser, closure->path);
189   gtk_file_chooser_set_current_name (chooser, closure->current_name);
190 }
191
192 static void
193 compare_current_name_cb (GtkFileChooser *chooser, gpointer data)
194 {
195   struct current_name_closure *closure;
196   char *out_filename;
197   char *filename;
198
199   closure = data;
200
201   out_filename = gtk_file_chooser_get_filename (chooser);
202
203   g_assert (out_filename != NULL);
204
205   filename = g_build_filename (closure->path, closure->current_name, NULL);
206   g_assert_cmpstr (filename, ==, out_filename);
207
208   g_free (filename);
209   g_free (out_filename);
210 }
211
212 typedef struct
213 {
214   const char *test_name;
215   GtkFileChooserAction action;
216   const char *current_name;
217   gboolean focus_button;
218 } TestSetCurrentNameSetup;
219
220 static void
221 test_black_box_set_current_name (gconstpointer data)
222 {
223   const TestSetCurrentNameSetup *setup = data;
224   struct current_name_closure closure;
225   char *cwd;
226
227   cwd = g_get_current_dir ();
228
229   closure.path = cwd;
230   closure.current_name = setup->current_name;
231
232   test_set_filename (setup->action, setup->focus_button, set_current_name_cb, compare_current_name_cb, &closure);
233
234   g_free (cwd);
235 }
236 #endif
237
238 /* FIXME: fails in CREATE_FOLDER mode when FOLDER_NAME == "/" */
239
240 #if 0
241 #define FILE_NAME "/nonexistent"
242 #define FILE_NAME_2 "/nonexistent2"
243 #define FOLDER_NAME "/etc"
244 #define FOLDER_NAME_2 "/usr"
245 #else
246 #define FILE_NAME "/etc/passwd"
247 #define FILE_NAME_2 "/etc/group"
248 #define FOLDER_NAME "/etc"
249 #define FOLDER_NAME_2 "/usr"
250 #endif
251
252 #define CURRENT_NAME "parangaricutirimicuaro.txt"
253 #define CURRENT_NAME_FOLDER "parangaricutirimicuaro"
254
255 /* https://bugzilla.novell.com/show_bug.cgi?id=184875
256  * http://bugzilla.gnome.org/show_bug.cgi?id=347066
257  * http://bugzilla.gnome.org/show_bug.cgi?id=346058
258  */
259
260 #ifdef BROKEN_TESTS
261 static void
262 setup_set_filename_tests (void)
263 {
264   static TestSetFilenameSetup tests[] =
265     {
266       { "/GtkFileChooser/black_box/set_filename/open/no_focus",          GTK_FILE_CHOOSER_ACTION_OPEN,          FILE_NAME,  FALSE },
267       { "/GtkFileChooser/black_box/set_filename/open/focus",             GTK_FILE_CHOOSER_ACTION_OPEN,          FILE_NAME,  TRUE  },
268       { "/GtkFileChooser/black_box/set_filename/save/no_focus",          GTK_FILE_CHOOSER_ACTION_SAVE,          FILE_NAME,  FALSE },
269       { "/GtkFileChooser/black_box/set_filename/save/focus",             GTK_FILE_CHOOSER_ACTION_SAVE,          FILE_NAME,  TRUE  },
270       { "/GtkFileChooser/black_box/set_filename/select_folder/no_focus", GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER, FOLDER_NAME,FALSE },
271       { "/GtkFileChooser/black_box/set_filename/select_folder/focus",    GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER, FOLDER_NAME,TRUE  },
272       { "/GtkFileChooser/black_box/set_filename/create_folder/no_focus", GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER, FOLDER_NAME,FALSE },
273       { "/GtkFileChooser/black_box/set_filename/create_folder/focus",    GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER, FOLDER_NAME,TRUE  },
274     };
275   int i;
276
277   for (i = 0; i < G_N_ELEMENTS (tests); i++)
278     g_test_add_data_func (tests[i].test_name, &tests[i], test_black_box_set_filename);
279 }
280
281 static void
282 setup_set_current_name_tests (void)
283 {
284   static TestSetCurrentNameSetup tests[] =
285     {
286       { "/GtkFileChooser/black_box/set_current_name/save/no_focus",          GTK_FILE_CHOOSER_ACTION_SAVE,          CURRENT_NAME,        FALSE },
287       { "/GtkFileChooser/black_box/set_current_name/save/focus",             GTK_FILE_CHOOSER_ACTION_SAVE,          CURRENT_NAME,        TRUE  },
288       { "/GtkFileChooser/black_box/set_current_name/create_folder/no_focus", GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER, CURRENT_NAME_FOLDER, FALSE },
289       { "/GtkFileChooser/black_box/set_current_name/create_folder/focus",    GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER, CURRENT_NAME_FOLDER, TRUE  },
290     };
291   int i;
292
293   for (i = 0; i < G_N_ELEMENTS (tests); i++)
294     g_test_add_data_func (tests[i].test_name, &tests[i], test_black_box_set_current_name);
295 }
296 #endif
297
298 typedef struct
299 {
300   const char *shortname;
301   GtkFileChooserAction action;
302   const char *initial_current_folder;
303   const char *initial_filename;
304   gboolean open_dialog;
305   const char *tweak_current_folder;
306   const char *tweak_filename;
307   gint dialog_response;
308   const char *final_current_folder;
309   const char *final_filename;
310 } FileChooserButtonTest;
311
312 static char *
313 make_button_test_name (FileChooserButtonTest *t)
314 {
315   return g_strdup_printf ("/GtkFileChooserButton/%s", t->shortname);
316 #if 0
317   GString *s = g_string_new ("/GtkFileChooserButton");
318
319   g_string_append_printf (s, "/%s/%s/%s/%s",
320                           get_action_name (t->action),
321                           t->initial_current_folder ? "set_initial_folder" : "no_default_folder",
322                           t->initial_filename ? "set_initial_filename" : "no_initial_filename",
323                           t->open_dialog ? "open_dialog" : "no_dialog");
324
325   if (t->tweak_current_folder)
326     g_string_append (s, "/tweak_current_folder");
327
328   if (t->tweak_filename)
329     g_string_append (s, "/tweak_filename");
330
331   if (t->open_dialog)
332     g_string_append_printf (s, "/%s",
333                             t->dialog_response == GTK_RESPONSE_ACCEPT ? "accept" : "cancel");
334
335   if (t->final_current_folder)
336     g_string_append (s, "/final_current_folder");
337
338   if (t->final_filename)
339     g_string_append (s, "/final_filename");
340
341   return g_string_free (s, FALSE);
342 #endif
343 }
344
345 /* Copied from gtkfilechooserutils.c:_gtk_file_chooser_delegate_get_quark() */
346 static GQuark
347 delegate_get_quark (void)
348 {
349   static GQuark quark = 0;
350
351   if (G_UNLIKELY (quark == 0))
352     quark = g_quark_from_static_string ("gtk-file-chooser-delegate");
353
354   return quark;
355 }
356
357 static gboolean
358 sleep_timeout_cb (gpointer data)
359 {
360   gtk_main_quit ();
361   return FALSE;
362 }
363
364 static void
365 sleep_in_main_loop (void)
366 {
367   /* process all pending idles and events */
368   while (g_main_context_pending (NULL))
369     g_main_context_iteration (NULL, FALSE);
370   /* sleeping probably isn't strictly necessary here */
371   gdk_threads_add_timeout_full (G_MAXINT, 250, sleep_timeout_cb, NULL, NULL);
372   gtk_main ();
373   /* process any pending idles or events that arrived during sleep */
374   while (g_main_context_pending (NULL))
375     g_main_context_iteration (NULL, FALSE);
376 }
377
378 static void
379 test_file_chooser_button (gconstpointer data)
380 {
381   const FileChooserButtonTest *setup = data;
382   GtkWidget *window;
383   GtkWidget *fc_button;
384   GtkWidget *fc_dialog;
385   int iterations;
386   int i;
387
388   window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
389
390   fc_button = gtk_file_chooser_button_new (setup->action == GTK_FILE_CHOOSER_ACTION_OPEN ? "Select a file" : "Select a folder",
391                                            setup->action);
392   gtk_container_add (GTK_CONTAINER (window), fc_button);
393
394   if (setup->initial_current_folder)
395     gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (fc_button), setup->initial_current_folder);
396
397   if (setup->initial_filename)
398     gtk_file_chooser_select_filename (GTK_FILE_CHOOSER (fc_button), setup->initial_filename);
399
400   gtk_widget_show_all (window);
401   wait_for_idle ();
402
403   /* If there is a dialog to be opened, we actually test going through it a
404    * couple of times.  This ensures that any state that the button frobs for
405    * each appearance of the dialog will make sense.
406    */
407   if (setup->open_dialog)
408     iterations = 2;
409   else
410     iterations = 1;
411
412   for (i = 0; i < iterations; i++)
413     {
414       if (setup->open_dialog)
415         {
416           GList *children;
417
418           /* Hack our way into the file chooser button; get its GtkButton child and click it */
419           children = gtk_container_get_children (GTK_CONTAINER (fc_button));
420           g_assert (children && GTK_IS_BUTTON (children->data));
421           gtk_button_clicked (GTK_BUTTON (children->data));
422           g_list_free (children);
423
424           sleep_in_main_loop ();
425
426           /* Give me the internal dialog, damnit */
427           fc_dialog = g_object_get_qdata (G_OBJECT (fc_button), delegate_get_quark ());
428           g_assert (GTK_IS_FILE_CHOOSER (fc_dialog));
429           g_assert (GTK_IS_DIALOG (fc_dialog));
430         }
431
432       /* Okay, now frob the button and its optional dialog */
433
434       if (setup->tweak_current_folder)
435         gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (fc_button), setup->tweak_current_folder);
436
437       if (setup->tweak_filename)
438         gtk_file_chooser_select_filename (GTK_FILE_CHOOSER (fc_button), setup->tweak_filename);
439
440       sleep_in_main_loop ();
441
442       if (setup->open_dialog)
443         {
444           gtk_dialog_response (GTK_DIALOG (fc_dialog), setup->dialog_response);
445           wait_for_idle ();
446         }
447
448       if (setup->final_current_folder)
449         {
450           char *folder = gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER (fc_button));
451
452           g_assert_cmpstr (folder, ==, setup->final_current_folder);
453           g_free (folder);
454         }
455
456       if (setup->final_filename)
457         {
458           char *filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (fc_button));
459
460           g_assert_cmpstr (filename, ==, setup->final_filename);
461           g_free (filename);
462         }
463     }
464
465   gtk_widget_destroy (window);
466 }
467
468 static FileChooserButtonTest button_tests[] =
469   {
470     /* OPEN tests without dialog */
471
472     {
473       "open-1",
474       GTK_FILE_CHOOSER_ACTION_OPEN,
475       NULL,                     /* initial_current_folder */
476       NULL,                     /* initial_filename */
477       FALSE,                    /* open_dialog */
478       NULL,                     /* tweak_current_folder */
479       NULL,                     /* tweak_filename */
480       0,                        /* dialog_response */
481       NULL,                     /* final_current_folder */
482       NULL                      /* final_filename */
483     },
484     {
485       "open-2",
486       GTK_FILE_CHOOSER_ACTION_OPEN,
487       NULL,                     /* initial_current_folder */
488       FILE_NAME,                /* initial_filename */
489       FALSE,                    /* open_dialog */
490       NULL,                     /* tweak_current_folder */
491       NULL,                     /* tweak_filename */
492       0,                        /* dialog_response */
493       NULL,                     /* final_current_folder */
494       FILE_NAME                 /* final_filename */
495     },
496     {
497       "open-3",
498       GTK_FILE_CHOOSER_ACTION_OPEN,
499       NULL,                     /* initial_current_folder */
500       NULL,                     /* initial_filename */
501       FALSE,                    /* open_dialog */
502       NULL,                     /* tweak_current_folder */
503       FILE_NAME,                /* tweak_filename */
504       0,                        /* dialog_response */
505       NULL,                     /* final_current_folder */
506       FILE_NAME                 /* final_filename */
507     },
508     {
509       "open-4",
510       GTK_FILE_CHOOSER_ACTION_OPEN,
511       NULL,                     /* initial_current_folder */
512       FILE_NAME,                /* initial_filename */
513       FALSE,                    /* open_dialog */
514       NULL,                     /* tweak_current_folder */
515       FILE_NAME_2,              /* tweak_filename */
516       0,                        /* dialog_response */
517       NULL,                     /* final_current_folder */
518       FILE_NAME_2               /* final_filename */
519     },
520     {
521       "open-5",
522       GTK_FILE_CHOOSER_ACTION_OPEN,
523       FOLDER_NAME,              /* initial_current_folder */
524       NULL,                     /* initial_filename */
525       FALSE,                    /* open_dialog */
526       NULL,                     /* tweak_current_folder */
527       NULL,                     /* tweak_filename */
528       0,                        /* dialog_response */
529       FOLDER_NAME,              /* final_current_folder */
530       NULL                      /* final_filename */
531     },
532     {
533       "open-6",
534       GTK_FILE_CHOOSER_ACTION_OPEN,
535       FOLDER_NAME,              /* initial_current_folder */
536       NULL,                     /* initial_filename */
537       FALSE,                    /* open_dialog */
538       FOLDER_NAME_2,            /* tweak_current_folder */
539       NULL,                     /* tweak_filename */
540       0,                        /* dialog_response */
541       FOLDER_NAME_2,            /* final_current_folder */
542       NULL                      /* final_filename */
543     },
544
545     /* SELECT_FOLDER tests without dialog */
546
547     {
548       "select-folder-1",
549       GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
550       NULL,                     /* initial_current_folder */
551       NULL,                     /* initial_filename */
552       FALSE,                    /* open_dialog */
553       NULL,                     /* tweak_current_folder */
554       NULL,                     /* tweak_filename */
555       0,                        /* dialog_response */
556       NULL,                     /* final_current_folder */
557       NULL                      /* final_filename */
558     },
559     {
560       "select-folder-2",
561       GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
562       NULL,                     /* initial_current_folder */
563       FOLDER_NAME,              /* initial_filename */
564       FALSE,                    /* open_dialog */
565       NULL,                     /* tweak_current_folder */
566       NULL,                     /* tweak_filename */
567       0,                        /* dialog_response */
568       NULL,                     /* final_current_folder */
569       FOLDER_NAME               /* final_filename */
570     },
571     {
572       "select-folder-3",
573       GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
574       NULL,                     /* initial_current_folder */
575       FOLDER_NAME,              /* initial_filename */
576       FALSE,                    /* open_dialog */
577       NULL,                     /* tweak_current_folder */
578       FOLDER_NAME_2,            /* tweak_filename */
579       0,                        /* dialog_response */
580       NULL,                     /* final_current_folder */
581       FOLDER_NAME_2             /* final_filename */
582     },
583     {
584       "select-folder-4",
585       GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
586       FOLDER_NAME,              /* initial_current_folder */
587       NULL,                     /* initial_filename */
588       FALSE,                    /* open_dialog */
589       NULL,                     /* tweak_current_folder */
590       NULL,                     /* tweak_filename */
591       0,                        /* dialog_response */
592       NULL,                     /* final_current_folder */
593       FOLDER_NAME               /* final_filename */
594     },
595     {
596       "select-folder-5",
597       GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
598       FOLDER_NAME,              /* initial_current_folder */
599       NULL,                     /* initial_filename */
600       FALSE,                    /* open_dialog */
601       NULL,                     /* tweak_current_folder */
602       NULL,                     /* tweak_filename */
603       0,                        /* dialog_response */
604       FOLDER_NAME,              /* final_current_folder */
605       NULL                      /* final_filename */
606     },
607     {
608       "select-folder-6",
609       GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
610       FOLDER_NAME,              /* initial_current_folder */
611       NULL,                     /* initial_filename */
612       FALSE,                    /* open_dialog */
613       FOLDER_NAME_2,            /* tweak_current_folder */
614       NULL,                     /* tweak_filename */
615       0,                        /* dialog_response */
616       NULL,                     /* final_current_folder */
617       FOLDER_NAME_2             /* final_filename */
618     },
619     {
620       "select-folder-7",
621       GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
622       FOLDER_NAME,              /* initial_current_folder */
623       NULL,                     /* initial_filename */
624       FALSE,                    /* open_dialog */
625       FOLDER_NAME_2,            /* tweak_current_folder */
626       NULL,                     /* tweak_filename */
627       0,                        /* dialog_response */
628       FOLDER_NAME_2,            /* final_current_folder */
629       NULL                      /* final_filename */
630     },
631     {
632       "select-folder-8",
633       GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
634       FOLDER_NAME,              /* initial_current_folder */
635       NULL,                     /* initial_filename */
636       FALSE,                    /* open_dialog */
637       NULL,                     /* tweak_current_folder */
638       FOLDER_NAME_2,            /* tweak_filename */
639       0,                        /* dialog_response */
640       NULL,                     /* final_current_folder */
641       FOLDER_NAME_2             /* final_filename */
642     },
643
644     /* OPEN tests with dialog, cancelled */
645
646     {
647       "open-dialog-cancel-1",
648       GTK_FILE_CHOOSER_ACTION_OPEN,
649       NULL,                     /* initial_current_folder */
650       NULL,                     /* initial_filename */
651       TRUE,                     /* open_dialog */
652       NULL,                     /* tweak_current_folder */
653       NULL,                     /* tweak_filename */
654       GTK_RESPONSE_CANCEL,      /* dialog_response */
655       NULL,                     /* final_current_folder */
656       NULL                      /* final_filename */
657     },
658     {
659       "open-dialog-cancel-2",
660       GTK_FILE_CHOOSER_ACTION_OPEN,
661       NULL,                     /* initial_current_folder */
662       FILE_NAME,                /* initial_filename */
663       TRUE,                     /* open_dialog */
664       NULL,                     /* tweak_current_folder */
665       NULL,                     /* tweak_filename */
666       GTK_RESPONSE_CANCEL,      /* dialog_response */
667       NULL,                     /* final_current_folder */
668       FILE_NAME                 /* final_filename */
669     },
670     {
671       "open-dialog-cancel-3",
672       GTK_FILE_CHOOSER_ACTION_OPEN,
673       FOLDER_NAME,              /* initial_current_folder */
674       NULL,                     /* initial_filename */
675       TRUE,                     /* open_dialog */
676       NULL,                     /* tweak_current_folder */
677       NULL,                     /* tweak_filename */
678       GTK_RESPONSE_CANCEL,      /* dialog_response */
679       FOLDER_NAME,              /* final_current_folder */
680       NULL                      /* final_filename */
681     },
682     {
683       "open-dialog-cancel-4",
684       GTK_FILE_CHOOSER_ACTION_OPEN,
685       NULL,                     /* initial_current_folder */
686       NULL,                     /* initial_filename */
687       TRUE,                     /* open_dialog */
688       NULL,                     /* tweak_current_folder */
689       FILE_NAME,                /* tweak_filename */
690       GTK_RESPONSE_CANCEL,      /* dialog_response */
691       NULL,                     /* final_current_folder */
692       NULL                      /* final_filename */
693     },
694     {
695       "open-dialog-cancel-5",
696       GTK_FILE_CHOOSER_ACTION_OPEN,
697       NULL,                     /* initial_current_folder */
698       FILE_NAME,                /* initial_filename */
699       TRUE,                     /* open_dialog */
700       NULL,                     /* tweak_current_folder */
701       FILE_NAME_2,              /* tweak_filename */
702       GTK_RESPONSE_CANCEL,      /* dialog_response */
703       NULL,                     /* final_current_folder */
704       FILE_NAME                 /* final_filename */
705     },
706     {
707       "open-dialog-cancel-6",
708       GTK_FILE_CHOOSER_ACTION_OPEN,
709       FOLDER_NAME,              /* initial_current_folder */
710       NULL,                     /* initial_filename */
711       TRUE,                     /* open_dialog */
712       NULL,                     /* tweak_current_folder */
713       FILE_NAME_2,              /* tweak_filename */
714       GTK_RESPONSE_CANCEL,      /* dialog_response */
715       FOLDER_NAME,              /* final_current_folder */
716       NULL                      /* final_filename */
717     },
718
719     /* OPEN tests with dialog, cancelled via closing the dialog (not by selecting the Cancel button) */
720
721     {
722       "open-dialog-close-1",
723       GTK_FILE_CHOOSER_ACTION_OPEN,
724       NULL,                     /* initial_current_folder */
725       NULL,                     /* initial_filename */
726       TRUE,                     /* open_dialog */
727       NULL,                     /* tweak_current_folder */
728       NULL,                     /* tweak_filename */
729       GTK_RESPONSE_DELETE_EVENT,/* dialog_response */
730       NULL,                     /* final_current_folder */
731       NULL                      /* final_filename */
732     },
733     {
734       "open-dialog-close-2",
735       GTK_FILE_CHOOSER_ACTION_OPEN,
736       NULL,                     /* initial_current_folder */
737       FILE_NAME,                /* initial_filename */
738       TRUE,                     /* open_dialog */
739       NULL,                     /* tweak_current_folder */
740       NULL,                     /* tweak_filename */
741       GTK_RESPONSE_DELETE_EVENT,/* dialog_response */
742       NULL,                     /* final_current_folder */
743       FILE_NAME                 /* final_filename */
744     },
745     {
746       "open-dialog-close-3",
747       GTK_FILE_CHOOSER_ACTION_OPEN,
748       FOLDER_NAME,              /* initial_current_folder */
749       NULL,                     /* initial_filename */
750       TRUE,                     /* open_dialog */
751       NULL,                     /* tweak_current_folder */
752       NULL,                     /* tweak_filename */
753       GTK_RESPONSE_DELETE_EVENT,/* dialog_response */
754       FOLDER_NAME,              /* final_current_folder */
755       NULL                      /* final_filename */
756     },
757     {
758       "open-dialog-close-4",
759       GTK_FILE_CHOOSER_ACTION_OPEN,
760       NULL,                     /* initial_current_folder */
761       NULL,                     /* initial_filename */
762       TRUE,                     /* open_dialog */
763       NULL,                     /* tweak_current_folder */
764       FILE_NAME,                /* tweak_filename */
765       GTK_RESPONSE_DELETE_EVENT,/* dialog_response */
766       NULL,                     /* final_current_folder */
767       NULL                      /* final_filename */
768     },
769     {
770       "open-dialog-close-5",
771       GTK_FILE_CHOOSER_ACTION_OPEN,
772       NULL,                     /* initial_current_folder */
773       FILE_NAME,                /* initial_filename */
774       TRUE,                     /* open_dialog */
775       NULL,                     /* tweak_current_folder */
776       FILE_NAME_2,              /* tweak_filename */
777       GTK_RESPONSE_DELETE_EVENT,/* dialog_response */
778       NULL,                     /* final_current_folder */
779       FILE_NAME                 /* final_filename */
780     },
781     {
782       "open-dialog-close-6",
783       GTK_FILE_CHOOSER_ACTION_OPEN,
784       FOLDER_NAME,              /* initial_current_folder */
785       NULL,                     /* initial_filename */
786       TRUE,                     /* open_dialog */
787       NULL,                     /* tweak_current_folder */
788       FILE_NAME_2,              /* tweak_filename */
789       GTK_RESPONSE_DELETE_EVENT,/* dialog_response */
790       FOLDER_NAME,              /* final_current_folder */
791       NULL                      /* final_filename */
792     },
793
794     /* SELECT_FOLDER tests with dialog, cancelled */
795
796     {
797       "select-folder-dialog-cancel-1",
798       GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
799       NULL,                     /* initial_current_folder */
800       NULL,                     /* initial_filename */
801       TRUE,                     /* open_dialog */
802       NULL,                     /* tweak_current_folder */
803       NULL,                     /* tweak_filename */
804       GTK_RESPONSE_CANCEL,      /* dialog_response */
805       NULL,                     /* final_current_folder */
806       NULL                      /* final_filename */
807     },
808     {
809       "select-folder-dialog-cancel-2",
810       GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
811       NULL,                     /* initial_current_folder */
812       FOLDER_NAME,              /* initial_filename */
813       TRUE,                     /* open_dialog */
814       NULL,                     /* tweak_current_folder */
815       NULL,                     /* tweak_filename */
816       GTK_RESPONSE_CANCEL,      /* dialog_response */
817       NULL,                     /* final_current_folder */
818       FOLDER_NAME               /* final_filename */
819     },
820     {
821       "select-folder-dialog-cancel-3",
822       GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
823       FOLDER_NAME,              /* initial_current_folder */
824       NULL,                     /* initial_filename */
825       TRUE,                     /* open_dialog */
826       NULL,                     /* tweak_current_folder */
827       NULL,                     /* tweak_filename */
828       GTK_RESPONSE_CANCEL,      /* dialog_response */
829       FOLDER_NAME,              /* final_current_folder */
830       NULL                      /* final_filename */
831     },
832     {
833       "select-folder-dialog-cancel-4",
834       GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
835       FOLDER_NAME,              /* initial_current_folder */
836       NULL,                     /* initial_filename */
837       TRUE,                     /* open_dialog */
838       NULL,                     /* tweak_current_folder */
839       NULL,                     /* tweak_filename */
840       GTK_RESPONSE_CANCEL,      /* dialog_response */
841       NULL,                     /* final_current_folder */
842       FOLDER_NAME               /* final_filename */
843     },
844     {
845       "select-folder-dialog-cancel-5",
846       GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
847       NULL,                     /* initial_current_folder */
848       NULL,                     /* initial_filename */
849       TRUE,                     /* open_dialog */
850       NULL,                     /* tweak_current_folder */
851       FOLDER_NAME,              /* tweak_filename */
852       GTK_RESPONSE_CANCEL,      /* dialog_response */
853       NULL,                     /* final_current_folder */
854       NULL                      /* final_filename */
855     },
856     {
857       "select-folder-dialog-cancel-6",
858       GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
859       NULL,                     /* initial_current_folder */
860       FOLDER_NAME,              /* initial_filename */
861       TRUE,                     /* open_dialog */
862       NULL,                     /* tweak_current_folder */
863       FOLDER_NAME_2,            /* tweak_filename */
864       GTK_RESPONSE_CANCEL,      /* dialog_response */
865       NULL,                     /* final_current_folder */
866       FOLDER_NAME               /* final_filename */
867     },
868     {
869       "select-folder-dialog-cancel-7",
870       GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
871       FOLDER_NAME,              /* initial_current_folder */
872       NULL,                     /* initial_filename */
873       TRUE,                     /* open_dialog */
874       NULL,                     /* tweak_current_folder */
875       FOLDER_NAME_2,            /* tweak_filename */
876       GTK_RESPONSE_CANCEL,      /* dialog_response */
877       FOLDER_NAME,              /* final_current_folder */
878       NULL                      /* final_filename */
879     },
880     {
881       "select-folder-dialog-cancel-8",
882       GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
883       FOLDER_NAME,              /* initial_current_folder */
884       NULL,                     /* initial_filename */
885       TRUE,                     /* open_dialog */
886       NULL,                     /* tweak_current_folder */
887       FOLDER_NAME_2,            /* tweak_filename */
888       GTK_RESPONSE_CANCEL,      /* dialog_response */
889       NULL,                     /* final_current_folder */
890       FOLDER_NAME               /* final_filename */
891     },
892
893     /* SELECT_FOLDER tests with dialog, cancelled via closing the dialog (not selecting the Cancel button) */
894
895     {
896       "select-folder-dialog-close-1",
897       GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
898       NULL,                     /* initial_current_folder */
899       NULL,                     /* initial_filename */
900       TRUE,                     /* open_dialog */
901       NULL,                     /* tweak_current_folder */
902       NULL,                     /* tweak_filename */
903       GTK_RESPONSE_DELETE_EVENT,/* dialog_response */
904       NULL,                     /* final_current_folder */
905       NULL                      /* final_filename */
906     },
907     {
908       "select-folder-dialog-close-2",
909       GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
910       NULL,                     /* initial_current_folder */
911       FOLDER_NAME,              /* initial_filename */
912       TRUE,                     /* open_dialog */
913       NULL,                     /* tweak_current_folder */
914       NULL,                     /* tweak_filename */
915       GTK_RESPONSE_DELETE_EVENT,/* dialog_response */
916       NULL,                     /* final_current_folder */
917       FOLDER_NAME               /* final_filename */
918     },
919     {
920       "select-folder-dialog-close-3",
921       GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
922       FOLDER_NAME,              /* initial_current_folder */
923       NULL,                     /* initial_filename */
924       TRUE,                     /* open_dialog */
925       NULL,                     /* tweak_current_folder */
926       NULL,                     /* tweak_filename */
927       GTK_RESPONSE_DELETE_EVENT,/* dialog_response */
928       FOLDER_NAME,              /* final_current_folder */
929       NULL                      /* final_filename */
930     },
931     {
932       "select-folder-dialog-close-4",
933       GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
934       FOLDER_NAME,              /* initial_current_folder */
935       NULL,                     /* initial_filename */
936       TRUE,                     /* open_dialog */
937       NULL,                     /* tweak_current_folder */
938       NULL,                     /* tweak_filename */
939       GTK_RESPONSE_DELETE_EVENT,/* dialog_response */
940       NULL,                     /* final_current_folder */
941       FOLDER_NAME               /* final_filename */
942     },
943     {
944       "select-folder-dialog-close-5",
945       GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
946       NULL,                     /* initial_current_folder */
947       NULL,                     /* initial_filename */
948       TRUE,                     /* open_dialog */
949       NULL,                     /* tweak_current_folder */
950       FOLDER_NAME,              /* tweak_filename */
951       GTK_RESPONSE_DELETE_EVENT,/* dialog_response */
952       NULL,                     /* final_current_folder */
953       NULL                      /* final_filename */
954     },
955     {
956       "select-folder-dialog-close-6",
957       GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
958       NULL,                     /* initial_current_folder */
959       FOLDER_NAME,              /* initial_filename */
960       TRUE,                     /* open_dialog */
961       NULL,                     /* tweak_current_folder */
962       FOLDER_NAME_2,            /* tweak_filename */
963       GTK_RESPONSE_DELETE_EVENT,/* dialog_response */
964       NULL,                     /* final_current_folder */
965       FOLDER_NAME               /* final_filename */
966     },
967     {
968       "select-folder-dialog-close-7",
969       GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
970       FOLDER_NAME,              /* initial_current_folder */
971       NULL,                     /* initial_filename */
972       TRUE,                     /* open_dialog */
973       NULL,                     /* tweak_current_folder */
974       FOLDER_NAME_2,            /* tweak_filename */
975       GTK_RESPONSE_DELETE_EVENT,/* dialog_response */
976       FOLDER_NAME,              /* final_current_folder */
977       NULL                      /* final_filename */
978     },
979     {
980       "select-folder-dialog-close-8",
981       GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
982       FOLDER_NAME,              /* initial_current_folder */
983       NULL,                     /* initial_filename */
984       TRUE,                     /* open_dialog */
985       NULL,                     /* tweak_current_folder */
986       FOLDER_NAME_2,            /* tweak_filename */
987       GTK_RESPONSE_DELETE_EVENT,/* dialog_response */
988       NULL,                     /* final_current_folder */
989       FOLDER_NAME               /* final_filename */
990     },
991
992     /* OPEN tests with dialog */
993
994     {
995       "open-dialog-1",
996       GTK_FILE_CHOOSER_ACTION_OPEN,
997       NULL,                     /* initial_current_folder */
998       NULL,                     /* initial_filename */
999       TRUE,                     /* open_dialog */
1000       NULL,                     /* tweak_current_folder */
1001       FILE_NAME,                /* tweak_filename */
1002       GTK_RESPONSE_ACCEPT,      /* dialog_response */
1003       NULL,                     /* final_current_folder */
1004       FILE_NAME                 /* final_filename */
1005     },
1006     {
1007       "open-dialog-2",
1008       GTK_FILE_CHOOSER_ACTION_OPEN,
1009       NULL,                     /* initial_current_folder */
1010       FILE_NAME,                /* initial_filename */
1011       TRUE,                     /* open_dialog */
1012       NULL,                     /* tweak_current_folder */
1013       NULL,                     /* tweak_filename */
1014       GTK_RESPONSE_ACCEPT,      /* dialog_response */
1015       NULL,                     /* final_current_folder */
1016       FILE_NAME                 /* final_filename */
1017     },
1018     {
1019       "open-dialog-3",
1020       GTK_FILE_CHOOSER_ACTION_OPEN,
1021       NULL,                     /* initial_current_folder */
1022       FILE_NAME,                /* initial_filename */
1023       TRUE,                     /* open_dialog */
1024       NULL,                     /* tweak_current_folder */
1025       FILE_NAME_2,              /* tweak_filename */
1026       GTK_RESPONSE_ACCEPT,      /* dialog_response */
1027       NULL,                     /* final_current_folder */
1028       FILE_NAME_2               /* final_filename */
1029     },
1030     {
1031       "open-dialog-4",
1032       GTK_FILE_CHOOSER_ACTION_OPEN,
1033       FOLDER_NAME,              /* initial_current_folder */
1034       NULL,                     /* initial_filename */
1035       TRUE,                     /* open_dialog */
1036       NULL,                     /* tweak_current_folder */
1037       FILE_NAME,                /* tweak_filename */
1038       GTK_RESPONSE_ACCEPT,      /* dialog_response */
1039       NULL,                     /* final_current_folder */
1040       FILE_NAME                 /* final_filename */
1041     },
1042
1043     /* SELECT_FOLDER tests with dialog */
1044
1045     {
1046       "select-folder-dialog-1",
1047       GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
1048       NULL,                     /* initial_current_folder */
1049       FOLDER_NAME,              /* initial_filename */
1050       TRUE,                     /* open_dialog */
1051       NULL,                     /* tweak_current_folder */
1052       NULL,                     /* tweak_filename */
1053       GTK_RESPONSE_ACCEPT,      /* dialog_response */
1054       NULL,                     /* final_current_folder */
1055       FOLDER_NAME               /* final_filename */
1056     },
1057     {
1058       "select-folder-dialog-2",
1059       GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
1060       FOLDER_NAME,              /* initial_current_folder */
1061       NULL,                     /* initial_filename */
1062       TRUE,                     /* open_dialog */
1063       NULL,                     /* tweak_current_folder */
1064       NULL,                     /* tweak_filename */
1065       GTK_RESPONSE_ACCEPT,      /* dialog_response */
1066       NULL,                     /* final_current_folder */
1067       FOLDER_NAME               /* final_filename */
1068     },
1069     {
1070       "select-folder-dialog-3",
1071       GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
1072       NULL,                     /* initial_current_folder */
1073       FOLDER_NAME,              /* initial_filename */
1074       TRUE,                     /* open_dialog */
1075       NULL,                     /* tweak_current_folder */
1076       FOLDER_NAME_2,            /* tweak_filename */
1077       GTK_RESPONSE_ACCEPT,      /* dialog_response */
1078       NULL,                     /* final_current_folder */
1079       FOLDER_NAME_2             /* final_filename */
1080     },
1081     {
1082       "select-folder-dialog-4",
1083       GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
1084       FOLDER_NAME,              /* initial_current_folder */
1085       NULL,                     /* initial_filename */
1086       TRUE,                     /* open_dialog */
1087       NULL,                     /* tweak_current_folder */
1088       FOLDER_NAME_2,            /* tweak_filename */
1089       GTK_RESPONSE_ACCEPT,      /* dialog_response */
1090       NULL,                     /* final_current_folder */
1091       FOLDER_NAME_2             /* final_filename */
1092     },
1093
1094   };
1095
1096 static void
1097 setup_file_chooser_button_tests (void)
1098 {
1099   int i;
1100
1101   for (i = 0; i < G_N_ELEMENTS (button_tests); i++)
1102     {
1103       char *test_name;
1104
1105       test_name = make_button_test_name (&button_tests[i]);
1106       g_test_add_data_func (test_name, &button_tests[i], test_file_chooser_button);
1107       g_free (test_name);
1108     }
1109 }
1110
1111 #ifdef BROKEN_TESTS
1112 struct confirm_overwrite_closure {
1113   GtkWidget *chooser;
1114   GtkWidget *accept_button;
1115   gint confirm_overwrite_signal_emitted;
1116   gchar *extension;
1117 };
1118
1119 static GtkFileChooserConfirmation
1120 confirm_overwrite_cb (GtkFileChooser *chooser, gpointer data)
1121 {
1122   struct confirm_overwrite_closure *closure = data;
1123
1124   if (g_test_verbose())
1125     printf ("bling!\n");
1126   closure->confirm_overwrite_signal_emitted += 1;
1127
1128   return GTK_FILE_CHOOSER_CONFIRMATION_ACCEPT_FILENAME;
1129 }
1130
1131 static void
1132 overwrite_response_cb (GtkFileChooser *chooser, gint response, gpointer data)
1133 {
1134   struct confirm_overwrite_closure *closure = data;
1135   char *filename;
1136
1137   if (g_test_verbose())
1138     printf ("plong!\n");
1139
1140   if (response != GTK_RESPONSE_ACCEPT)
1141     return;
1142
1143   filename = gtk_file_chooser_get_filename (chooser);
1144
1145   if (!g_str_has_suffix (filename, closure->extension))
1146     {
1147       char *basename;
1148
1149       basename = g_path_get_basename (filename);
1150       g_free (filename);
1151
1152       filename = g_strconcat (basename, closure->extension, NULL);
1153       gtk_file_chooser_set_current_name (chooser, filename);
1154
1155       g_signal_stop_emission_by_name (chooser, "response");
1156       gtk_dialog_response (GTK_DIALOG (chooser), GTK_RESPONSE_ACCEPT);
1157     }
1158 }
1159
1160 static gboolean
1161 confirm_overwrite_timeout_cb (gpointer data)
1162 {
1163   struct confirm_overwrite_closure *closure;
1164
1165   closure = data;
1166   gtk_button_clicked (GTK_BUTTON (closure->accept_button));
1167
1168   return FALSE;
1169 }
1170
1171 /* http://bugzilla.gnome.org/show_bug.cgi?id=347883 */
1172 static gboolean
1173 test_confirm_overwrite_for_path (const char *path, gboolean append_extension)
1174 {
1175   gboolean passed;
1176   struct confirm_overwrite_closure closure;
1177   char *filename;
1178
1179   passed = TRUE;
1180
1181   closure.extension = NULL;
1182   closure.confirm_overwrite_signal_emitted = 0;
1183   closure.chooser = gtk_file_chooser_dialog_new ("hello", NULL, GTK_FILE_CHOOSER_ACTION_SAVE,
1184                                                  GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
1185                                                  NULL);
1186   closure.accept_button = gtk_dialog_add_button (GTK_DIALOG (closure.chooser),
1187                                                  GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT);
1188   gtk_dialog_set_default_response (GTK_DIALOG (closure.chooser), GTK_RESPONSE_ACCEPT);
1189
1190   gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER (closure.chooser), TRUE);
1191
1192   g_signal_connect (closure.chooser, "confirm-overwrite",
1193                     G_CALLBACK (confirm_overwrite_cb), &closure);
1194
1195   if (append_extension)
1196     {
1197       char *extension;
1198
1199       filename = g_path_get_dirname (path);
1200       gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (closure.chooser), filename);
1201       g_free (filename);
1202
1203       filename = g_path_get_basename (path);
1204       extension = strchr (filename, '.');
1205
1206       if (extension)
1207         {
1208           closure.extension = g_strdup (extension);
1209           *extension = '\0';
1210         }
1211
1212       gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (closure.chooser), filename);
1213       g_free (filename);
1214
1215       g_signal_connect (closure.chooser, "response",
1216                         G_CALLBACK (overwrite_response_cb), &closure);
1217     }
1218   else
1219     {
1220       gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (closure.chooser), path);
1221     }
1222
1223   gdk_threads_add_timeout_full (G_MAXINT, SLEEP_DURATION, confirm_overwrite_timeout_cb, &closure, NULL);
1224   gtk_dialog_run (GTK_DIALOG (closure.chooser));
1225
1226   filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (closure.chooser));
1227   passed = passed && filename && (strcmp (filename, path) == 0);
1228   g_free (filename);
1229   
1230   gtk_widget_destroy (closure.chooser);
1231
1232   passed = passed && (1 == closure.confirm_overwrite_signal_emitted);
1233
1234   log_test (passed, "Confirm overwrite for %s", path);
1235
1236   return passed;
1237 }
1238
1239 static void
1240 test_confirm_overwrite (void)
1241 {
1242   gboolean passed = TRUE;
1243
1244   /* first test for a file we know will always exist */
1245   passed = passed && test_confirm_overwrite_for_path ("/etc/passwd", FALSE); 
1246   g_assert (passed);
1247   passed = passed && test_confirm_overwrite_for_path ("/etc/resolv.conf", TRUE); 
1248   g_assert (passed);
1249 }
1250 #endif
1251
1252 static const GtkFileChooserAction open_actions[] = {
1253   GTK_FILE_CHOOSER_ACTION_OPEN,
1254   GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER
1255 };
1256
1257 static const GtkFileChooserAction save_actions[] = {
1258   GTK_FILE_CHOOSER_ACTION_SAVE,
1259   GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER
1260 };
1261
1262
1263 #ifdef BROKEN_TESTS
1264 static gboolean
1265 has_action (const GtkFileChooserAction *actions,
1266             int n_actions,
1267             GtkFileChooserAction sought_action)
1268 {
1269   int i;
1270
1271   for (i = 0; i < n_actions; i++)
1272     if (actions[i] == sought_action)
1273       return TRUE;
1274
1275   return FALSE;
1276 }
1277
1278 static const char *
1279 get_action_name (GtkFileChooserAction action)
1280 {
1281   switch (action)
1282     {
1283     case GTK_FILE_CHOOSER_ACTION_OPEN:          return "OPEN";
1284     case GTK_FILE_CHOOSER_ACTION_SAVE:          return "SAVE";
1285     case GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER: return "SELECT_FOLDER";
1286     case GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER: return "CREATE_FOLDER";
1287
1288     default:
1289       g_assert_not_reached ();
1290       return NULL;
1291     }
1292 }
1293
1294 static GtkFileChooserDefault *
1295 get_impl_from_dialog (GtkWidget *dialog)
1296 {
1297   GtkFileChooserDialog *d;
1298   GtkFileChooserDialogPrivate *dialog_priv;
1299   GtkFileChooserWidget *chooser_widget;
1300   GtkFileChooserWidgetPrivate *widget_priv;
1301   GtkFileChooserDefault *impl;
1302
1303   d = GTK_FILE_CHOOSER_DIALOG (dialog);
1304   dialog_priv = d->priv;
1305   chooser_widget = GTK_FILE_CHOOSER_WIDGET (dialog_priv->widget);
1306   if (!chooser_widget)
1307     g_error ("BUG: dialog_priv->widget is not a GtkFileChooserWidget");
1308
1309   widget_priv = chooser_widget->priv;
1310   impl = (GtkFileChooserDefault *) (widget_priv->impl);
1311   if (!impl)
1312     g_error ("BUG: widget_priv->impl is not a GtkFileChooserDefault");
1313
1314   return impl;
1315 }
1316
1317 static gboolean
1318 test_widgets_for_current_action (GtkFileChooserDialog *dialog,
1319                                  GtkFileChooserAction  expected_action)
1320 {
1321   GtkFileChooserDefault *impl;
1322   gboolean passed;
1323
1324   if (gtk_file_chooser_get_action (GTK_FILE_CHOOSER (dialog)) != expected_action)
1325     return FALSE;
1326
1327   impl = get_impl_from_dialog (GTK_WIDGET (dialog));
1328
1329   g_assert (impl->action == expected_action);
1330
1331   passed = TRUE;
1332
1333   /* OPEN implies that the "new folder" button is hidden; otherwise it is shown */
1334   if (impl->action == GTK_FILE_CHOOSER_ACTION_OPEN)
1335     passed = passed && !gtk_widget_get_visible (impl->browse_new_folder_button);
1336   else
1337     passed = passed && gtk_widget_get_visible (impl->browse_new_folder_button);
1338
1339   /* Check that the widgets are present/visible or not */
1340   if (has_action (open_actions, G_N_ELEMENTS (open_actions), impl->action))
1341     {
1342       passed = passed && (impl->save_widgets == NULL
1343                           && (impl->location_mode == LOCATION_MODE_PATH_BAR
1344                               ? impl->location_entry == NULL
1345                               : impl->location_entry != NULL)
1346                           && impl->save_folder_label == NULL
1347                           && impl->save_folder_combo == NULL
1348                           && impl->save_expander == NULL
1349                           && GTK_IS_CONTAINER (impl->browse_widgets) && gtk_widget_is_drawable (impl->browse_widgets));
1350     }
1351   else if (has_action (save_actions, G_N_ELEMENTS (save_actions), impl->action))
1352     {
1353       /* FIXME: we can't use GTK_IS_FILE_CHOOSER_ENTRY() because it uses
1354        * _gtk_file_chooser_entry_get_type(), which is a non-exported symbol.
1355        * So, we just test impl->location_entry for being non-NULL
1356        */
1357       passed = passed && (GTK_IS_CONTAINER (impl->save_widgets) && gtk_widget_is_drawable (impl->save_widgets)
1358                           && impl->location_entry != NULL && gtk_widget_is_drawable (impl->location_entry)
1359                           && GTK_IS_LABEL (impl->save_folder_label) && gtk_widget_is_drawable (impl->save_folder_label)
1360                           && GTK_IS_COMBO_BOX (impl->save_folder_combo) && gtk_widget_is_drawable (impl->save_folder_combo)
1361                           && GTK_IS_EXPANDER (impl->save_expander) && gtk_widget_is_drawable (impl->save_expander)
1362                           && GTK_IS_CONTAINER (impl->browse_widgets));
1363
1364       /* FIXME: we are in a SAVE mode; test the visibility and sensitivity of
1365        * the children that change depending on the state of the expander.
1366        */
1367     }
1368   else
1369     {
1370       g_error ("BAD TEST: test_widgets_for_current_action() doesn't know about %s", get_action_name (impl->action));
1371       passed = FALSE;
1372     }
1373
1374   return passed;
1375 }
1376
1377 typedef gboolean (* ForeachActionCallback) (GtkFileChooserDialog *dialog,
1378                                             GtkFileChooserAction  action,
1379                                             gpointer              user_data);
1380
1381 static gboolean
1382 foreach_action (GtkFileChooserDialog *dialog,
1383                 ForeachActionCallback callback,
1384                 gpointer              user_data)
1385 {
1386   GEnumClass *enum_class;
1387   int i;
1388
1389   enum_class = g_type_class_peek (GTK_TYPE_FILE_CHOOSER_ACTION);
1390   if (!enum_class)
1391     g_error ("BUG: get_action_name(): no GEnumClass for GTK_TYPE_FILE_CHOOSER_ACTION");
1392
1393   for (i = 0; i < enum_class->n_values; i++)
1394     {
1395       GEnumValue *enum_value;
1396       GtkFileChooserAction action;
1397       gboolean passed;
1398
1399       enum_value = enum_class->values + i;
1400       action = enum_value->value;
1401
1402       passed = (* callback) (dialog, action, user_data);
1403       if (!passed)
1404         return FALSE;
1405     }
1406
1407   return TRUE;
1408 }
1409
1410 struct action_closure {
1411   GtkFileChooserAction from_action;
1412 };
1413
1414 static gboolean
1415 switch_from_to_action_cb (GtkFileChooserDialog *dialog,
1416                           GtkFileChooserAction  action,
1417                           gpointer              user_data)
1418 {
1419   struct action_closure *closure;
1420   gboolean passed;
1421
1422   closure = user_data;
1423
1424   gtk_file_chooser_set_action (GTK_FILE_CHOOSER (dialog), closure->from_action);
1425
1426   passed = test_widgets_for_current_action (dialog, closure->from_action);
1427   log_test (passed, "switch_from_to_action_cb(): reset to action %s", get_action_name (closure->from_action));
1428   if (!passed)
1429     return FALSE;
1430
1431   gtk_file_chooser_set_action (GTK_FILE_CHOOSER (dialog), action);
1432
1433   passed = test_widgets_for_current_action (dialog, action);
1434   log_test (passed, "switch_from_to_action_cb(): transition from %s to %s",
1435             get_action_name (closure->from_action),
1436             get_action_name (action));
1437   return passed;
1438 }
1439
1440 static gboolean
1441 switch_from_action_cb (GtkFileChooserDialog *dialog,
1442                        GtkFileChooserAction  action,
1443                        gpointer              user_data)
1444 {
1445   struct action_closure closure;
1446
1447   closure.from_action = action;
1448
1449   return foreach_action (dialog, switch_from_to_action_cb, &closure);
1450 }
1451
1452 static void
1453 test_action_widgets (void)
1454 {
1455   GtkWidget *dialog;
1456   GtkFileChooserAction action;
1457   gboolean passed;
1458
1459   dialog = gtk_file_chooser_dialog_new ("Test file chooser",
1460                                         NULL,
1461                                         GTK_FILE_CHOOSER_ACTION_OPEN,
1462                                         GTK_STOCK_CANCEL,
1463                                         GTK_RESPONSE_CANCEL,
1464                                         GTK_STOCK_OK,
1465                                         GTK_RESPONSE_ACCEPT,
1466                                         NULL);
1467   gtk_widget_show_now (dialog);
1468
1469   action = gtk_file_chooser_get_action (GTK_FILE_CHOOSER (dialog));
1470
1471   passed = test_widgets_for_current_action (GTK_FILE_CHOOSER_DIALOG (dialog), action);
1472   log_test (passed, "test_action_widgets(): widgets for initial action %s", get_action_name (action));
1473   g_assert (passed);
1474
1475   passed = foreach_action (GTK_FILE_CHOOSER_DIALOG (dialog), switch_from_action_cb, NULL);
1476   log_test (passed, "test_action_widgets(): all transitions through property change");
1477   g_assert (passed);
1478
1479   gtk_widget_destroy (dialog);
1480 }
1481 #endif
1482
1483 #ifdef BROKEN_TESTS
1484 static gboolean
1485 test_reload_sequence (gboolean set_folder_before_map)
1486 {
1487   GtkWidget *dialog;
1488   GtkFileChooserDefault *impl;
1489   gboolean passed;
1490   char *folder;
1491   char *current_working_dir;
1492
1493   passed = TRUE;
1494
1495   current_working_dir = g_get_current_dir ();
1496
1497   dialog = gtk_file_chooser_dialog_new ("Test file chooser",
1498                                         NULL,
1499                                         GTK_FILE_CHOOSER_ACTION_OPEN,
1500                                         GTK_STOCK_CANCEL,
1501                                         GTK_RESPONSE_CANCEL,
1502                                         GTK_STOCK_OK,
1503                                         GTK_RESPONSE_ACCEPT,
1504                                         NULL);
1505   impl = get_impl_from_dialog (dialog);
1506
1507   if (set_folder_before_map)
1508     {
1509       gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (dialog), g_get_home_dir ());
1510
1511       wait_for_idle ();
1512
1513       passed = passed && (impl->current_folder != NULL
1514                           && impl->browse_files_model != NULL
1515                           && (impl->load_state == LOAD_PRELOAD || impl->load_state == LOAD_LOADING || impl->load_state == LOAD_FINISHED)
1516                           && impl->reload_state == RELOAD_HAS_FOLDER
1517                           && (impl->load_state == LOAD_PRELOAD ? (impl->load_timeout_id != 0) : TRUE)
1518                           && ((impl->load_state == LOAD_LOADING || impl->load_state == LOAD_FINISHED)
1519                               ? (impl->load_timeout_id == 0 && impl->sort_model != NULL)
1520                               : TRUE));
1521
1522       wait_for_idle ();
1523
1524       folder = gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER (dialog));
1525       passed = passed && (g_strcmp0 (folder, g_get_home_dir()) == 0);
1526       g_free (folder);
1527     }
1528   else
1529     {
1530       /* Initially, no folder is not loaded or pending */
1531       passed = passed && (impl->current_folder == NULL
1532                           && impl->sort_model == NULL
1533                           && impl->browse_files_model == NULL
1534                           && impl->load_state == LOAD_EMPTY
1535                           && impl->reload_state == RELOAD_EMPTY
1536                           && impl->load_timeout_id == 0);
1537
1538       wait_for_idle ();
1539
1540       folder = gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER (dialog));
1541       passed = passed && (g_strcmp0 (folder, current_working_dir) == 0);
1542     }
1543
1544   log_test (passed, "test_reload_sequence(): initial status");
1545
1546   /* After mapping, it is loading some folder, either the one that was explicitly set or the default one */
1547
1548   gtk_widget_show_now (dialog);
1549
1550   wait_for_idle ();
1551
1552   passed = passed && (impl->current_folder != NULL
1553                       && impl->browse_files_model != NULL
1554                       && (impl->load_state == LOAD_PRELOAD || impl->load_state == LOAD_LOADING || impl->load_state == LOAD_FINISHED)
1555                       && impl->reload_state == RELOAD_HAS_FOLDER
1556                       && (impl->load_state == LOAD_PRELOAD ? (impl->load_timeout_id != 0) : TRUE)
1557                       && ((impl->load_state == LOAD_LOADING || impl->load_state == LOAD_FINISHED)
1558                           ? (impl->load_timeout_id == 0 && impl->sort_model != NULL)
1559                           : TRUE));
1560
1561   folder = gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER (dialog));
1562   if (set_folder_before_map)
1563     passed = passed && (g_strcmp0 (folder, g_get_home_dir()) == 0);
1564   else
1565     passed = passed && (g_strcmp0 (folder, current_working_dir) == 0);
1566
1567   g_free (folder);
1568
1569   log_test (passed, "test_reload_sequence(): status after map");
1570
1571   /* Unmap it; we should still have a folder */
1572
1573   gtk_widget_hide (dialog);
1574
1575   wait_for_idle ();
1576
1577   passed = passed && (impl->current_folder != NULL
1578                       && impl->browse_files_model != NULL
1579                       && (impl->load_state == LOAD_PRELOAD || impl->load_state == LOAD_LOADING || impl->load_state == LOAD_FINISHED)
1580                       && (impl->load_state == LOAD_PRELOAD ? (impl->load_timeout_id != 0) : TRUE)
1581                       && ((impl->load_state == LOAD_LOADING || impl->load_state == LOAD_FINISHED)
1582                           ? (impl->load_timeout_id == 0 && impl->sort_model != NULL)
1583                           : TRUE));
1584
1585   folder = gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER (dialog));
1586   if (set_folder_before_map)
1587     passed = passed && (g_strcmp0 (folder, g_get_home_dir()) == 0);
1588   else
1589     passed = passed && (g_strcmp0 (folder, current_working_dir) == 0);
1590
1591   g_free (folder);
1592
1593   log_test (passed, "test_reload_sequence(): status after unmap");
1594
1595   /* Map it again! */
1596
1597   gtk_widget_show_now (dialog);
1598
1599   wait_for_idle ();
1600
1601   passed = passed && (impl->current_folder != NULL
1602                       && impl->browse_files_model != NULL
1603                       && (impl->load_state == LOAD_PRELOAD || impl->load_state == LOAD_LOADING || impl->load_state == LOAD_FINISHED)
1604                       && impl->reload_state == RELOAD_HAS_FOLDER
1605                       && (impl->load_state == LOAD_PRELOAD ? (impl->load_timeout_id != 0) : TRUE)
1606                       && ((impl->load_state == LOAD_LOADING || impl->load_state == LOAD_FINISHED)
1607                           ? (impl->load_timeout_id == 0 && impl->sort_model != NULL)
1608                           : TRUE));
1609
1610   folder = gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER (dialog));
1611   if (set_folder_before_map)
1612     passed = passed && (g_strcmp0 (folder, g_get_home_dir()) == 0);
1613   else
1614     passed = passed && (g_strcmp0 (folder, current_working_dir) == 0);
1615
1616   g_free (folder);
1617
1618   log_test (passed, "test_reload_sequence(): status after re-map");
1619
1620   gtk_widget_destroy (dialog);
1621   g_free (current_working_dir);
1622
1623   return passed;
1624 }
1625
1626 static void
1627 test_reload (void)
1628 {
1629   gboolean passed;
1630
1631   passed = test_reload_sequence (FALSE);
1632   log_test (passed, "test_reload(): create and use the default folder");
1633   g_assert (passed);
1634
1635   passed = test_reload_sequence (TRUE);
1636   log_test (passed, "test_reload(): set a folder explicitly before mapping");
1637   g_assert (passed);
1638 }
1639
1640 static gboolean
1641 test_button_folder_states_for_action (GtkFileChooserAction action, gboolean use_dialog, gboolean set_folder_on_dialog)
1642 {
1643   gboolean passed;
1644   GtkWidget *window;
1645   GtkWidget *button;
1646   char *folder;
1647   GtkWidget *dialog;
1648   char *current_working_dir;
1649   gboolean must_have_cwd;
1650
1651   passed = TRUE;
1652
1653   current_working_dir = g_get_current_dir ();
1654   must_have_cwd = !(use_dialog && set_folder_on_dialog);
1655
1656   window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1657
1658   if (use_dialog)
1659     {
1660       dialog = gtk_file_chooser_dialog_new ("Test", NULL, action,
1661                                             GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
1662                                             GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
1663                                             NULL);
1664       button = gtk_file_chooser_button_new_with_dialog (dialog);
1665
1666       if (set_folder_on_dialog)
1667         gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (dialog), g_get_home_dir ());
1668     }
1669   else
1670     {
1671       button = gtk_file_chooser_button_new ("Test", action);
1672       dialog = NULL; /* keep gcc happy */
1673     }
1674
1675   gtk_container_add (GTK_CONTAINER (window), button);
1676
1677   /* Pre-map; no folder is set */
1678   wait_for_idle ();
1679
1680   folder = gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER (button));
1681   if (must_have_cwd)
1682     passed = passed && (g_strcmp0 (folder, current_working_dir) == 0);
1683   else
1684     passed = passed && (g_strcmp0 (folder, g_get_home_dir()) == 0);
1685
1686   log_test (passed, "test_button_folder_states_for_action(): %s, use_dialog=%d, set_folder_on_dialog=%d, pre-map, %s",
1687             get_action_name (action),
1688             use_dialog,
1689             set_folder_on_dialog,
1690             must_have_cwd ? "must have $cwd" : "must have explicit folder");
1691
1692   /* Map; folder should be set */
1693
1694   gtk_widget_show_all (window);
1695   gtk_widget_show_now (window);
1696
1697   wait_for_idle ();
1698
1699   folder = gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER (button));
1700
1701   if (must_have_cwd)
1702     passed = passed && (g_strcmp0 (folder, current_working_dir) == 0);
1703   else
1704     passed = passed && (g_strcmp0 (folder, g_get_home_dir()) == 0);
1705
1706   log_test (passed, "test_button_folder_states_for_action(): %s, use_dialog=%d, set_folder_on_dialog=%d, mapped, %s",
1707             get_action_name (action),
1708             use_dialog,
1709             set_folder_on_dialog,
1710             must_have_cwd ? "must have $cwd" : "must have explicit folder");
1711   g_free (folder);
1712
1713   /* Unmap; folder should be set */
1714
1715   gtk_widget_hide (window);
1716   wait_for_idle ();
1717   folder = gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER (button));
1718
1719   if (must_have_cwd)
1720     passed = passed && (g_strcmp0 (folder, current_working_dir) == 0);
1721   else
1722     passed = passed && (g_strcmp0 (folder, g_get_home_dir()) == 0);
1723
1724   log_test (passed, "test_button_folder_states_for_action(): %s, use_dialog=%d, set_folder_on_dialog=%d, unmapped, %s",
1725             get_action_name (action),
1726             use_dialog,
1727             set_folder_on_dialog,
1728             must_have_cwd ? "must have $cwd" : "must have explicit folder");
1729   g_free (folder);
1730
1731   /* Re-map; folder should be set */
1732
1733   gtk_widget_show_now (window);
1734   folder = gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER (button));
1735
1736   if (must_have_cwd)
1737     passed = passed && (g_strcmp0 (folder, current_working_dir) == 0);
1738   else
1739     passed = passed && (g_strcmp0 (folder, g_get_home_dir()) == 0);
1740   wait_for_idle ();
1741   log_test (passed, "test_button_folder_states_for_action(): %s, use_dialog=%d, set_folder_on_dialog=%d, re-mapped, %s",
1742             get_action_name (action),
1743             use_dialog,
1744             set_folder_on_dialog,
1745             must_have_cwd ? "must have $cwd" : "must have explicit folder");
1746   g_free (folder);
1747
1748   g_free (current_working_dir);
1749
1750   gtk_widget_destroy (window);
1751
1752   return passed;
1753 }
1754
1755 static void
1756 test_button_folder_states (void)
1757 {
1758   /* GtkFileChooserButton only supports OPEN and SELECT_FOLDER */
1759   static const GtkFileChooserAction actions_to_test[] = {
1760     GTK_FILE_CHOOSER_ACTION_OPEN,
1761     GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER
1762   };
1763   gboolean passed;
1764   int i;
1765
1766   passed = TRUE;
1767
1768   for (i = 0; i < G_N_ELEMENTS (actions_to_test); i++)
1769     {
1770       passed = passed && test_button_folder_states_for_action (actions_to_test[i], FALSE, FALSE);
1771       g_assert (passed);
1772       passed = passed && test_button_folder_states_for_action (actions_to_test[i], TRUE, FALSE);
1773       g_assert (passed);
1774       passed = passed && test_button_folder_states_for_action (actions_to_test[i], TRUE, TRUE);
1775       g_assert (passed);
1776       log_test (passed, "test_button_folder_states(): action %s", get_action_name (actions_to_test[i]));
1777     }
1778
1779   log_test (passed, "test_button_folder_states(): all supported actions");
1780 }
1781
1782 static void
1783 test_folder_switch_and_filters (void)
1784 {
1785   gboolean passed;
1786   char *cwd;
1787   char *base_dir;
1788   GFile *cwd_file;
1789   GFile *base_dir_file;
1790   GtkWidget *dialog;
1791   GtkFileFilter *all_filter;
1792   GtkFileFilter *txt_filter;
1793   GtkFileChooserDefault *impl;
1794
1795   passed = TRUE;
1796
1797   cwd = g_get_current_dir ();
1798   base_dir = g_build_filename (cwd, "file-chooser-test-dir", NULL);
1799
1800   dialog = gtk_file_chooser_dialog_new ("Test", NULL, GTK_FILE_CHOOSER_ACTION_OPEN,
1801                                         GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
1802                                         GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
1803                                         NULL);
1804   impl = get_impl_from_dialog (dialog);
1805
1806   cwd_file = g_file_new_for_path (cwd);
1807   base_dir_file = g_file_new_for_path (base_dir);
1808
1809   passed = passed && gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (dialog), base_dir);
1810   g_assert (passed);
1811
1812   /* All files filter */
1813
1814   all_filter = gtk_file_filter_new ();
1815   gtk_file_filter_set_name (all_filter, "All files");
1816   gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog), all_filter);
1817
1818   /* *.txt filter */
1819
1820   txt_filter = gtk_file_filter_new ();
1821   gtk_file_filter_set_name (all_filter, "*.txt");
1822   gtk_file_filter_add_pattern (txt_filter, "*.txt");
1823   gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog), txt_filter);
1824
1825   /* Test filter set */
1826
1827   gtk_file_chooser_set_filter (GTK_FILE_CHOOSER (dialog), all_filter);
1828   passed = passed && (gtk_file_chooser_get_filter (GTK_FILE_CHOOSER (dialog)) == all_filter);
1829   g_assert (passed);
1830
1831   gtk_file_chooser_set_filter (GTK_FILE_CHOOSER (dialog), txt_filter);
1832   passed = passed && (gtk_file_chooser_get_filter (GTK_FILE_CHOOSER (dialog)) == txt_filter);
1833   log_test (passed, "test_folder_switch_and_filters(): set and get filter");
1834   g_assert (passed);
1835
1836   gtk_widget_show (dialog);
1837
1838   /* Test that filter is unchanged when we switch folders */
1839
1840   gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (dialog), cwd);
1841   sleep_in_main_loop ();
1842   passed = passed && (gtk_file_chooser_get_filter (GTK_FILE_CHOOSER (dialog)) == txt_filter);
1843   g_assert (passed);
1844
1845   gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (dialog), base_dir);
1846   sleep_in_main_loop ();
1847
1848   g_signal_emit_by_name (impl->browse_path_bar, "path-clicked",
1849                          cwd_file,
1850                          base_dir_file,
1851                          FALSE);
1852   sleep_in_main_loop ();
1853   passed = passed && (gtk_file_chooser_get_filter (GTK_FILE_CHOOSER (dialog)) == txt_filter);
1854   log_test (passed, "test_folder_switch_and_filters(): filter after changing folder");
1855   g_assert (passed);
1856
1857   /* cleanups */
1858   g_free (cwd);
1859   g_free (base_dir);
1860   g_object_unref (cwd_file);
1861   g_object_unref (base_dir_file);
1862
1863   gtk_widget_destroy (dialog);
1864
1865   log_test (passed, "test_folder_switch_and_filters(): all filter tests");
1866 }
1867 #endif
1868
1869 int
1870 main (int    argc,
1871       char **argv)
1872 {
1873   /* initialize test program */
1874   gtk_test_init (&argc, &argv);
1875
1876   /* Register tests */
1877
1878   setup_file_chooser_button_tests ();
1879 #ifdef BROKEN_TESTS
1880   setup_set_filename_tests ();
1881   setup_set_current_name_tests ();
1882
1883   g_test_add_func ("/GtkFileChooser/confirm_overwrite", test_confirm_overwrite);
1884   g_test_add_func ("/GtkFileChooser/action_widgets", test_action_widgets);
1885   g_test_add_func ("/GtkFileChooser/reload", test_reload);
1886   g_test_add_func ("/GtkFileChooser/button_folder_states", test_button_folder_states);
1887   g_test_add_func ("/GtkFileChooser/folder_switch_and_filters", test_folder_switch_and_filters);
1888 #endif
1889
1890   /* run and check selected tests */
1891   return g_test_run();
1892 }