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