]> Pileus Git - ~andy/gtk/blob - gtk/tests/testing.c
Fixed copyright for newly submitted files.
[~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     gtk_main_iteration ();
43   g_assert (a == 0 && b > 0 && c == 0);
44   gtk_widget_destroy (window); // FIXME: use generic teardown
45 }
46
47 static void
48 test_button_keys (void)
49 {
50   int a = 0, b = 0, c = 0;
51   GtkWidget *window = gtk_test_display_button_window ("Test Window",
52                                                       "Test: gtk_test_widget_send_key",
53                                                       "IgnoreMe1", &a,
54                                                       "ClickMe", &b,
55                                                       "IgnoreMe2", &c,
56                                                       NULL);
57   GtkWidget *button = gtk_test_find_widget (window, "*Click*", GTK_TYPE_BUTTON);
58   gboolean simsuccess;
59   g_assert (button != NULL);
60   gtk_widget_grab_focus (button);
61   g_assert (GTK_WIDGET_HAS_FOCUS (button));
62   simsuccess = gtk_test_widget_send_key (button, GDK_Return, 0);
63   g_assert (simsuccess == TRUE);
64   while (gtk_events_pending ())
65     gtk_main_iteration ();
66   g_assert (a == 0 && b > 0 && c == 0);
67   gtk_widget_destroy (window); // FIXME: use generic teardown
68 }
69
70 static void
71 test_slider_ranges (void)
72 {
73   GtkWidget *window = gtk_test_create_simple_window ("Test Window", "Test: gtk_test_warp_slider");
74   GtkWidget *hscale = gtk_hscale_new_with_range (-50, +50, 5);
75   gtk_container_add (GTK_CONTAINER (GTK_BIN (window)->child), hscale);
76   gtk_widget_show (hscale);
77   gtk_widget_show_now (window);
78   while (gtk_events_pending ())
79     gtk_main_iteration ();
80   gtk_test_slider_set_perc (hscale, 0.0);
81   while (gtk_events_pending ())
82     gtk_main_iteration ();
83   g_assert (gtk_test_slider_get_value (hscale) == -50);
84   gtk_test_slider_set_perc (hscale, 50.0);
85   while (gtk_events_pending ())
86     gtk_main_iteration ();
87   g_assert (fabs (gtk_test_slider_get_value (hscale)) < 0.0001);
88   gtk_test_slider_set_perc (hscale, 100.0);
89   while (gtk_events_pending ())
90     gtk_main_iteration ();
91   g_assert (gtk_test_slider_get_value (hscale) == +50.0);
92   gtk_widget_destroy (window); // FIXME: use generic teardown
93 }
94
95 static void
96 test_text_access (void)
97 {
98   const int N_WIDGETS = 4;
99   GtkWidget *widgets[N_WIDGETS];
100   int i = 0;
101   widgets[i++] = gtk_test_create_widget (GTK_TYPE_LABEL, NULL);
102   widgets[i++] = gtk_test_create_widget (GTK_TYPE_ENTRY, NULL);
103   widgets[i++] = gtk_test_create_widget (GTK_TYPE_TEXT_VIEW, NULL);
104   widgets[i++] = gtk_test_create_widget (g_type_from_name ("GtkText"), NULL);
105   g_assert (i == N_WIDGETS);
106   for (i = 0; i < N_WIDGETS; i++)
107     gtk_test_text_set (widgets[i], "foobar");
108   for (i = 0; i < N_WIDGETS; i++)
109     {
110       gchar *text  = gtk_test_text_get (widgets[i]);
111       g_assert (strcmp (text, "foobar") == 0);
112       g_free (text);
113     }
114   for (i = 0; i < N_WIDGETS; i++)
115     gtk_test_text_set (widgets[i], "");
116   for (i = 0; i < N_WIDGETS; i++)
117     {
118       gchar *text  = gtk_test_text_get (widgets[i]);
119       g_assert (strcmp (text, "") == 0);
120       g_free (text);
121     }
122   for (i = 0; i < N_WIDGETS; i++)
123     gtk_widget_destroy (widgets[i]); // FIXME: use generic teardown
124 }
125
126 static void
127 test_xserver_sync (void)
128 {
129   GtkWidget *window = gtk_test_create_simple_window ("Test Window", "Test: test_xserver_sync");
130   GtkWidget *darea = gtk_drawing_area_new ();
131   GTimer *gtimer = g_timer_new();
132   gint sync_is_slower = 0, repeat = 5;
133   gtk_widget_set_size_request (darea, 320, 200);
134   gtk_container_add (GTK_CONTAINER (GTK_BIN (window)->child), darea);
135   gtk_widget_show (darea);
136   gtk_widget_show_now (window);
137   while (repeat--)
138     {
139       gint i, many = 100;
140       double nosync_time, sync_time;
141       while (gtk_events_pending ())
142         gtk_main_iteration ();
143       /* run a number of consecutive drawing requests, just using drawing queue */
144       g_timer_start (gtimer);
145       for (i = 0; i < many; i++)
146         {
147           gdk_draw_line (darea->window, darea->style->black_gc, 0, 0, 320, 200);
148           gdk_draw_line (darea->window, darea->style->black_gc, 320, 0, 0, 200);
149         }
150       g_timer_stop (gtimer);
151       nosync_time = g_timer_elapsed (gtimer, NULL);
152       gdk_flush();
153       while (gtk_events_pending ())
154         gtk_main_iteration ();
155       g_timer_start (gtimer);
156       /* run a number of consecutive drawing requests with intermediate drawing syncs */
157       for (i = 0; i < many; i++)
158         {
159           gdk_draw_line (darea->window, darea->style->black_gc, 0, 0, 320, 200);
160           gdk_draw_line (darea->window, darea->style->black_gc, 320, 0, 0, 200);
161           gdk_test_render_sync (darea->window);
162         }
163       g_timer_stop (gtimer);
164       sync_time = g_timer_elapsed (gtimer, NULL);
165       sync_is_slower += sync_time > nosync_time * 1.5;
166     }
167   g_timer_destroy (gtimer);
168   g_assert (sync_is_slower > 0);
169   gtk_widget_destroy (window); // FIXME: use generic teardown
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   /* shutdown */
216   gtk_widget_destroy (window); // FIXME: use generic teardown
217 }
218
219 int
220 main (int   argc,
221       char *argv[])
222 {
223   gtk_test_init (&argc, &argv);
224   gtk_test_register_all_types();
225   test_text_access();
226   test_button_clicks();
227   test_button_keys();
228   test_slider_ranges();
229   test_xserver_sync();
230   test_spin_button_arrows();
231   return 0;
232 }