]> Pileus Git - ~andy/gtk/blob - gtk/tests/testing.c
fc4244225c198287176ae9ad1623977837120017
[~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_hscale_new_with_range (-50, +50, 5);
80
81   child = gtk_bin_get_child (GTK_BIN (window));
82   gtk_container_add (GTK_CONTAINER (child), hscale);
83   gtk_widget_show (hscale);
84   gtk_widget_show_now (window);
85   while (gtk_events_pending ())
86     gtk_main_iteration ();
87   gtk_test_slider_set_perc (hscale, 0.0);
88   while (gtk_events_pending ())
89     gtk_main_iteration ();
90   g_assert (gtk_test_slider_get_value (hscale) == -50);
91   gtk_test_slider_set_perc (hscale, 50.0);
92   while (gtk_events_pending ())
93     gtk_main_iteration ();
94   g_assert (fabs (gtk_test_slider_get_value (hscale)) < 0.0001);
95   gtk_test_slider_set_perc (hscale, 100.0);
96   while (gtk_events_pending ())
97     gtk_main_iteration ();
98   g_assert (gtk_test_slider_get_value (hscale) == +50.0);
99 }
100
101 static void
102 test_text_access (void)
103 {
104   const int N_WIDGETS = 3;
105   GtkWidget *widgets[N_WIDGETS];
106   int i = 0;
107   widgets[i++] = gtk_test_create_widget (GTK_TYPE_LABEL, NULL);
108   widgets[i++] = gtk_test_create_widget (GTK_TYPE_ENTRY, NULL);
109   widgets[i++] = gtk_test_create_widget (GTK_TYPE_TEXT_VIEW, NULL);
110   g_assert (i == N_WIDGETS);
111   for (i = 0; i < N_WIDGETS; i++)
112     gtk_test_text_set (widgets[i], "foobar");
113   for (i = 0; i < N_WIDGETS; i++)
114     {
115       gchar *text  = gtk_test_text_get (widgets[i]);
116       g_assert (strcmp (text, "foobar") == 0);
117       g_free (text);
118     }
119   for (i = 0; i < N_WIDGETS; i++)
120     gtk_test_text_set (widgets[i], "");
121   for (i = 0; i < N_WIDGETS; i++)
122     {
123       gchar *text  = gtk_test_text_get (widgets[i]);
124       g_assert (strcmp (text, "") == 0);
125       g_free (text);
126     }
127 }
128
129 static void
130 test_xserver_sync (void)
131 {
132   GtkWidget *window = gtk_test_create_simple_window ("Test Window", "Test: test_xserver_sync");
133   GtkWidget *darea = gtk_drawing_area_new ();
134   GtkWidget *child;
135   GdkWindow *gdk_window;
136   GTimer *gtimer = g_timer_new();
137   gint sync_is_slower = 0, repeat = 5;
138
139   child = gtk_bin_get_child (GTK_BIN (window));
140   //gdk_window = gtk_widget_get_window (darea);
141
142   gtk_widget_set_size_request (darea, 320, 200);
143   gtk_container_add (GTK_CONTAINER (child), darea);
144   gtk_widget_show (darea);
145   gtk_widget_show_now (window);
146
147   while (repeat--)
148     {
149       gint i, many = 200;
150       double nosync_time, sync_time;
151       cairo_t *cr;
152
153       while (gtk_events_pending ())
154         gtk_main_iteration ();
155       gdk_window = gtk_widget_get_window (darea);
156       cr = gdk_cairo_create (gdk_window);
157       cairo_set_source_rgba (cr, 0, 1, 0, 0.1);
158       /* run a number of consecutive drawing requests, just using drawing queue */
159       g_timer_start (gtimer);
160       for (i = 0; i < many; i++)
161         {
162           cairo_paint (cr);
163         }
164       g_timer_stop (gtimer);
165       nosync_time = g_timer_elapsed (gtimer, NULL);
166       gdk_flush();
167       while (gtk_events_pending ())
168         gtk_main_iteration ();
169       g_timer_start (gtimer);
170       /* run a number of consecutive drawing requests with intermediate drawing syncs */
171       for (i = 0; i < many; i++)
172         {
173           cairo_paint (cr);
174           gdk_test_render_sync (gdk_window);
175         }
176       g_timer_stop (gtimer);
177       sync_time = g_timer_elapsed (gtimer, NULL);
178       sync_is_slower += sync_time > nosync_time * 1.5;
179     }
180   g_timer_destroy (gtimer);
181   g_assert (sync_is_slower > 0);
182 }
183
184 static void
185 test_spin_button_arrows (void)
186 {
187   GtkWidget *child;
188   GtkWidget *window = gtk_test_create_simple_window ("Test Window", "Test: test_spin_button_arrows");
189   GtkWidget *spinner = gtk_spin_button_new_with_range (0, 100, 5);
190   gboolean simsuccess;
191   double oldval, newval;
192
193   gtk_window_set_has_resize_grip (GTK_WINDOW (window), FALSE);
194
195   child = gtk_bin_get_child (GTK_BIN (window));
196   gtk_container_add (GTK_CONTAINER (child), spinner);
197   gtk_widget_show (spinner);
198   gtk_widget_show_now (window);
199   gtk_test_slider_set_perc (spinner, 0);
200   /* check initial spinner value */
201   oldval = gtk_test_slider_get_value (spinner);
202   g_assert (oldval == 0);
203   /* check simple increment */
204   simsuccess = gtk_test_spin_button_click (GTK_SPIN_BUTTON (spinner), 1, TRUE);
205   g_assert (simsuccess == TRUE);
206   while (gtk_events_pending ()) /* let spin button timeout/idle handlers update */
207     gtk_main_iteration ();
208   newval = gtk_test_slider_get_value (spinner);
209   g_assert (newval > oldval);
210   /* check maximum warp */
211   simsuccess = gtk_test_spin_button_click (GTK_SPIN_BUTTON (spinner), 3, TRUE);
212   g_assert (simsuccess == TRUE);
213   while (gtk_events_pending ()) /* let spin button timeout/idle handlers update */
214     gtk_main_iteration ();
215   oldval = gtk_test_slider_get_value (spinner);
216   g_assert (oldval == 100);
217   /* check simple decrement */
218   oldval = gtk_test_slider_get_value (spinner);
219   simsuccess = gtk_test_spin_button_click (GTK_SPIN_BUTTON (spinner), 1, FALSE);
220   g_assert (simsuccess == TRUE);
221   while (gtk_events_pending ()) /* let spin button timeout/idle handlers update */
222     gtk_main_iteration ();
223   newval = gtk_test_slider_get_value (spinner);
224   g_assert (newval < oldval);
225   /* check minimum warp */
226   simsuccess = gtk_test_spin_button_click (GTK_SPIN_BUTTON (spinner), 3, FALSE);
227   g_assert (simsuccess == TRUE);
228   while (gtk_events_pending ()) /* let spin button timeout/idle handlers update */
229     gtk_main_iteration ();
230   oldval = gtk_test_slider_get_value (spinner);
231   g_assert (oldval == 0);
232 }
233
234 int
235 main (int   argc,
236       char *argv[])
237 {
238   gtk_test_init (&argc, &argv);
239   gtk_test_register_all_types();
240   g_test_add_func ("/ui-tests/text-access", test_text_access);
241   g_test_add_func ("/ui-tests/button-clicks", test_button_clicks);
242   g_test_add_func ("/ui-tests/keys-events", test_button_keys);
243   g_test_add_func ("/ui-tests/slider-ranges", test_slider_ranges);
244   g_test_add_func ("/ui-tests/xserver-sync", test_xserver_sync);
245   g_test_add_func ("/ui-tests/spin-button-arrows", test_spin_button_arrows);
246   return g_test_run();
247 }