]> Pileus Git - ~andy/gtk/blob - gtk/tests/testing.c
Merge branch 'master' into broadway
[~andy/gtk] / gtk / tests / testing.c
1 /* Gtk+ testing utilities
2  * Copyright (C) 2007 Imendio AB
3  * Authors: Tim Janik
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Lesser General Public
7  * License as published by the Free Software Foundation; either
8  * version 2 of the License, or (at your option) any later version.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * Lesser General Public License for more details.
14  *
15  * You should have received a copy of the GNU Lesser General Public
16  * License along with this library; if not, write to the
17  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18  * Boston, MA 02111-1307, USA.
19  */
20 #include <gtk/gtk.h>
21 #include <gdk/gdkkeysyms.h>
22 #include <string.h>
23 #include <math.h>
24
25 /* --- test functions --- */
26 static void
27 test_button_clicks (void)
28 {
29   int a = 0, b = 0, c = 0;
30   GtkWidget *window = gtk_test_display_button_window ("Test Window",
31                                                       "Test: gtk_test_widget_click",
32                                                       "IgnoreMe1", &a,
33                                                       "ClickMe", &b,
34                                                       "IgnoreMe2", &c,
35                                                       NULL);
36   GtkWidget *button = gtk_test_find_widget (window, "*Click*", GTK_TYPE_BUTTON);
37   gboolean simsuccess;
38   g_assert (button != NULL);
39   simsuccess = gtk_test_widget_click (button, 1, 0);
40   g_assert (simsuccess == TRUE);
41   while (gtk_events_pending ()) {
42     g_print ("iterate main loop\n");
43     gtk_main_iteration ();
44   }
45   g_assert (a == 0);
46   g_assert (b > 0);
47   g_assert (c == 0);
48 }
49
50 static void
51 test_button_keys (void)
52 {
53   int a = 0, b = 0, c = 0;
54   GtkWidget *window = gtk_test_display_button_window ("Test Window",
55                                                       "Test: gtk_test_widget_send_key",
56                                                       "IgnoreMe1", &a,
57                                                       "ClickMe", &b,
58                                                       "IgnoreMe2", &c,
59                                                       NULL);
60   GtkWidget *button = gtk_test_find_widget (window, "*Click*", GTK_TYPE_BUTTON);
61   gboolean simsuccess;
62   g_assert (button != NULL);
63   gtk_widget_grab_focus (button);
64   g_assert (gtk_widget_has_focus (button));
65   simsuccess = gtk_test_widget_send_key (button, GDK_KEY_Return, 0);
66   g_assert (simsuccess == TRUE);
67   while (gtk_events_pending ())
68     gtk_main_iteration ();
69   g_assert (a == 0);
70   g_assert (b > 0);
71   g_assert (c == 0);
72 }
73
74 static void
75 test_slider_ranges (void)
76 {
77   GtkWidget *child;
78   GtkWidget *window = gtk_test_create_simple_window ("Test Window", "Test: gtk_test_warp_slider");
79   GtkWidget *hscale = gtk_scale_new_with_range (GTK_ORIENTATION_HORIZONTAL,
80                                                 -50, +50, 5);
81
82   child = gtk_bin_get_child (GTK_BIN (window));
83   gtk_container_add (GTK_CONTAINER (child), hscale);
84   gtk_widget_show (hscale);
85   gtk_widget_show_now (window);
86   while (gtk_events_pending ())
87     gtk_main_iteration ();
88   gtk_test_slider_set_perc (hscale, 0.0);
89   while (gtk_events_pending ())
90     gtk_main_iteration ();
91   g_assert (gtk_test_slider_get_value (hscale) == -50);
92   gtk_test_slider_set_perc (hscale, 50.0);
93   while (gtk_events_pending ())
94     gtk_main_iteration ();
95   g_assert (fabs (gtk_test_slider_get_value (hscale)) < 0.0001);
96   gtk_test_slider_set_perc (hscale, 100.0);
97   while (gtk_events_pending ())
98     gtk_main_iteration ();
99   g_assert (gtk_test_slider_get_value (hscale) == +50.0);
100 }
101
102 static void
103 test_text_access (void)
104 {
105   const int N_WIDGETS = 3;
106   GtkWidget *widgets[N_WIDGETS];
107   int i = 0;
108   widgets[i++] = gtk_test_create_widget (GTK_TYPE_LABEL, NULL);
109   widgets[i++] = gtk_test_create_widget (GTK_TYPE_ENTRY, NULL);
110   widgets[i++] = gtk_test_create_widget (GTK_TYPE_TEXT_VIEW, NULL);
111   g_assert (i == N_WIDGETS);
112   for (i = 0; i < N_WIDGETS; i++)
113     gtk_test_text_set (widgets[i], "foobar");
114   for (i = 0; i < N_WIDGETS; i++)
115     {
116       gchar *text  = gtk_test_text_get (widgets[i]);
117       g_assert (strcmp (text, "foobar") == 0);
118       g_free (text);
119     }
120   for (i = 0; i < N_WIDGETS; i++)
121     gtk_test_text_set (widgets[i], "");
122   for (i = 0; i < N_WIDGETS; i++)
123     {
124       gchar *text  = gtk_test_text_get (widgets[i]);
125       g_assert (strcmp (text, "") == 0);
126       g_free (text);
127     }
128 }
129
130 static void
131 test_xserver_sync (void)
132 {
133   GtkWidget *window = gtk_test_create_simple_window ("Test Window", "Test: test_xserver_sync");
134   GtkWidget *darea = gtk_drawing_area_new ();
135   GtkWidget *child;
136   GdkWindow *gdk_window;
137   GTimer *gtimer = g_timer_new();
138   gint sync_is_slower = 0, repeat = 5;
139
140   child = gtk_bin_get_child (GTK_BIN (window));
141   //gdk_window = gtk_widget_get_window (darea);
142
143   gtk_widget_set_size_request (darea, 320, 200);
144   gtk_container_add (GTK_CONTAINER (child), darea);
145   gtk_widget_show (darea);
146   gtk_widget_show_now (window);
147
148   while (repeat--)
149     {
150       gint i, many = 200;
151       double nosync_time, sync_time;
152       cairo_t *cr;
153
154       while (gtk_events_pending ())
155         gtk_main_iteration ();
156       gdk_window = gtk_widget_get_window (darea);
157       cr = gdk_cairo_create (gdk_window);
158       cairo_set_source_rgba (cr, 0, 1, 0, 0.1);
159       /* run a number of consecutive drawing requests, just using drawing queue */
160       g_timer_start (gtimer);
161       for (i = 0; i < many; i++)
162         {
163           cairo_paint (cr);
164         }
165       g_timer_stop (gtimer);
166       nosync_time = g_timer_elapsed (gtimer, NULL);
167       gdk_flush();
168       while (gtk_events_pending ())
169         gtk_main_iteration ();
170       g_timer_start (gtimer);
171       /* run a number of consecutive drawing requests with intermediate drawing syncs */
172       for (i = 0; i < many; i++)
173         {
174           cairo_paint (cr);
175           gdk_test_render_sync (gdk_window);
176         }
177       g_timer_stop (gtimer);
178       sync_time = g_timer_elapsed (gtimer, NULL);
179       sync_is_slower += sync_time > nosync_time * 1.5;
180     }
181   g_timer_destroy (gtimer);
182   g_assert (sync_is_slower > 0);
183 }
184
185 static void
186 test_spin_button_arrows (void)
187 {
188   GtkWidget *child;
189   GtkWidget *window = gtk_test_create_simple_window ("Test Window", "Test: test_spin_button_arrows");
190   GtkWidget *spinner = gtk_spin_button_new_with_range (0, 100, 5);
191   gboolean simsuccess;
192   double oldval, newval;
193
194   gtk_window_set_has_resize_grip (GTK_WINDOW (window), FALSE);
195
196   child = gtk_bin_get_child (GTK_BIN (window));
197   gtk_container_add (GTK_CONTAINER (child), spinner);
198   gtk_widget_show (spinner);
199   gtk_widget_show_now (window);
200   gtk_test_slider_set_perc (spinner, 0);
201   /* check initial spinner value */
202   oldval = gtk_test_slider_get_value (spinner);
203   g_assert (oldval == 0);
204   /* check simple increment */
205   simsuccess = gtk_test_spin_button_click (GTK_SPIN_BUTTON (spinner), 1, TRUE);
206   g_assert (simsuccess == TRUE);
207   while (gtk_events_pending ()) /* let spin button timeout/idle handlers update */
208     gtk_main_iteration ();
209   newval = gtk_test_slider_get_value (spinner);
210   g_assert (newval > oldval);
211   /* check maximum warp */
212   simsuccess = gtk_test_spin_button_click (GTK_SPIN_BUTTON (spinner), 3, TRUE);
213   g_assert (simsuccess == TRUE);
214   while (gtk_events_pending ()) /* let spin button timeout/idle handlers update */
215     gtk_main_iteration ();
216   oldval = gtk_test_slider_get_value (spinner);
217   g_assert (oldval == 100);
218   /* check simple decrement */
219   oldval = gtk_test_slider_get_value (spinner);
220   simsuccess = gtk_test_spin_button_click (GTK_SPIN_BUTTON (spinner), 1, FALSE);
221   g_assert (simsuccess == TRUE);
222   while (gtk_events_pending ()) /* let spin button timeout/idle handlers update */
223     gtk_main_iteration ();
224   newval = gtk_test_slider_get_value (spinner);
225   g_assert (newval < oldval);
226   /* check minimum warp */
227   simsuccess = gtk_test_spin_button_click (GTK_SPIN_BUTTON (spinner), 3, FALSE);
228   g_assert (simsuccess == TRUE);
229   while (gtk_events_pending ()) /* let spin button timeout/idle handlers update */
230     gtk_main_iteration ();
231   oldval = gtk_test_slider_get_value (spinner);
232   g_assert (oldval == 0);
233 }
234
235 static void
236 test_statusbar_remove_all (void)
237 {
238   GtkWidget *statusbar;
239
240   g_test_bug ("640487");
241
242   statusbar = gtk_statusbar_new ();
243   g_object_ref_sink (statusbar);
244
245   gtk_statusbar_push (GTK_STATUSBAR (statusbar), 1, "bla");
246   gtk_statusbar_push (GTK_STATUSBAR (statusbar), 1, "bla");
247   gtk_statusbar_remove_all (GTK_STATUSBAR (statusbar), 1);
248
249   g_object_unref (statusbar);
250 }
251
252 int
253 main (int   argc,
254       char *argv[])
255 {
256   gtk_test_init (&argc, &argv);
257   g_test_bug_base ("http://bugzilla.gnome.org/");
258   gtk_test_register_all_types();
259
260   g_test_add_func ("/tests/statusbar-remove-all", test_statusbar_remove_all);
261   g_test_add_func ("/ui-tests/text-access", test_text_access);
262   g_test_add_func ("/ui-tests/button-clicks", test_button_clicks);
263   g_test_add_func ("/ui-tests/keys-events", test_button_keys);
264   g_test_add_func ("/ui-tests/slider-ranges", test_slider_ranges);
265   g_test_add_func ("/ui-tests/xserver-sync", test_xserver_sync);
266   g_test_add_func ("/ui-tests/spin-button-arrows", test_spin_button_arrows);
267
268   return g_test_run();
269 }