root/gtkimageview/tests/test-signals.c

Revision 288, 8.5 kB (checked in by bjourne, 6 years ago)

GtkFitMode was removed along with gtk_image_view_set_fit_mode() and
gtk_image_view_get_fit_mode(). Since there were only two items in the
enum (fit or not fit), it was much cleaner to just pass a gboolean.
The accessor functions has also been renamed to
gtk_image_view_set_fitting() and gtk_image_view_get_fit_mode() to
reflect this new and simpler interface.

Line 
1 /* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; coding: utf-8 -*-
2  *
3  * This file tests the various user-defined signals that GtkImageView
4  * emits.
5  *
6  * Each of the following actions may trigger a zoom-changed signal:
7  *
8  * 1. Calling gtk_image_view_set_zoom ()
9  * 2. Calling gtk_image_view_set_fitting ()
10  * 3. Calling gtk_image_view_zoom_in/out ()
11  * 4. Calling gtk_image_view_set_pixbuf ()
12  * 5. Sending a size-allocate event.
13  **/
14 #include <src/gtkimageview.h>
15 #include <src/gtkzooms.h>
16 #include <assert.h>
17
18
19 static int num_calls = 0;
20
21 static gdouble gotten_zoom = -1;
22 static void
23 zoom_changed_cb (GtkImageView *view)
24 {
25     gotten_zoom = gtk_image_view_get_zoom (view);
26     num_calls++;
27 }
28
29 static GdkScrollDirection gotten_dir = -1;
30 static void
31 mouse_wheel_scroll_cb (GtkImageView       *view,
32                                            GdkScrollDirection  dir)
33 {
34         gotten_dir = dir;
35         num_calls++;
36 }
37
38 static void
39 pixbuf_changed_cb (GtkImageView *view)
40 {
41     num_calls++;
42 }
43
44 /**
45  * test_zoom_changed_emitted_by_setting_zoom:
46  *
47  * The objective of this test is to verify that the zoom-changed
48  * signal is emitted whenever gtk_image_view_set_zoom() is called with
49  * a zoom not equal to the current zoom.
50  *
51  **/
52 static void
53 test_zoom_changed_emitted_by_setting_zoom ()
54 {
55     printf ("test_zoom_changed_emitted_by_setting_zoom\n");
56     GtkWidget *view = GTK_WIDGET (gtk_image_view_new ());
57     g_object_ref (view);
58     gtk_object_sink (GTK_OBJECT (view));
59
60     g_signal_connect (G_OBJECT (view), "zoom_changed",
61                       G_CALLBACK (zoom_changed_cb), NULL);
62
63     gdouble zooms[] = {3.0, 0.55, 1.2, 0.01};
64     for (int n = 0; n < G_N_ELEMENTS (zooms); n++)
65     {
66         num_calls = 0;
67         gtk_image_view_set_zoom (GTK_IMAGE_VIEW (view), zooms[n]);
68
69         gdouble expected_zoom = gtk_zooms_clamp_zoom (zooms[n]);
70         assert (num_calls == 1);
71         assert (gotten_zoom == expected_zoom);
72     }
73
74     gtk_widget_destroy (view);
75     g_object_unref (view);
76 }
77
78 /**
79  * test_not_zoom_changed_emitted_by_setting_equal_zoom
80  *
81  * The objective of this test is to verify that the zoom-changed
82  * signal is NOT emitted if gtk_image_view_set_zoom () is called with
83  * a zoom EQUAL to the current zoom.
84  **/
85 static void
86 test_not_zoom_changed_emitted_by_setting_equal_zoom ()
87 {
88     printf ("test_not_zoom_changed_emitted_by_setting_equal_zoom\n");
89     GtkWidget *view = GTK_WIDGET (gtk_image_view_new ());
90     g_object_ref (view);
91     gtk_object_sink (GTK_OBJECT (view));
92
93     g_signal_connect (G_OBJECT (view), "zoom_changed",
94                       G_CALLBACK (zoom_changed_cb), NULL);
95
96     gdouble zooms[] = {3.0, 0.55, 1.2, 0.01};
97     num_calls = 0;
98     for (int n = 0; n < G_N_ELEMENTS (zooms); n++)
99     {
100         gtk_image_view_set_zoom (GTK_IMAGE_VIEW (view), zooms[n]);
101         gtk_image_view_set_zoom (GTK_IMAGE_VIEW (view), zooms[n]);
102         gtk_image_view_set_zoom (GTK_IMAGE_VIEW (view), zooms[n]);
103         /* Signal is only emitted once per loop. */
104         assert (num_calls == n + 1);
105     }
106
107     gtk_widget_destroy (view);
108     g_object_unref (view);
109 }
110
111 /**
112  * test_zoom_changed_emitted_by_size_allocate:
113  *
114  * The objective of this test is to verify that the zoom-changed
115  * signal is emitted when size allocate causes the zoom to change and
116  * that the zoom-changed signal is NOT emitted when size allocate does
117  * NOT cause the zoom.
118  **/
119 static void
120 test_zoom_changed_emitted_by_size_allocate ()
121 {
122     printf ("test_zoom_changed_emitted_by_size_allocate\n");
123     GtkWidget *view = GTK_WIDGET (gtk_image_view_new ());
124     g_object_ref (view);
125     gtk_object_sink (GTK_OBJECT (view));
126
127     GtkAllocation alloc = {0, 0, 200, 200};
128     gtk_widget_size_allocate (view, &alloc);
129
130     GdkPixbuf *pixbuf1 = gdk_pixbuf_new (GDK_COLORSPACE_RGB, FALSE,
131                                          8, 500, 500);
132     GdkPixbuf *pixbuf2 = gdk_pixbuf_new (GDK_COLORSPACE_RGB, FALSE,
133                                          8, 50, 50);
134    
135     g_signal_connect (G_OBJECT (view), "zoom_changed",
136                       G_CALLBACK (zoom_changed_cb), NULL);
137
138     gtk_image_view_set_pixbuf (GTK_IMAGE_VIEW (view), pixbuf1, TRUE);
139    
140     num_calls = 0;
141     gtk_widget_size_allocate (view, &alloc);
142     assert (num_calls == 1);
143
144     /* Recalcing the zoom again does not cause zoom-changed to be
145        emitted. */
146     gtk_widget_size_allocate (view, &alloc);
147     assert (num_calls == 1);
148    
149     g_object_unref (pixbuf1);
150     g_object_unref (pixbuf2);
151
152     gtk_widget_destroy (view);
153     g_object_unref (view);
154 }
155
156 /**
157  * test_scroll_event_emits_mouse_wheel_scroll:
158  *
159  * The objective of this test is to verify that the mouse_wheel_scroll
160  * signal is emitted when the widget receives a scroll event whose
161  * direction is either GDK_SCROLL_UP or GDK_SCROLL_DOWN and whoes
162  * state flags does not include GDK_CONTROL_MASK.
163  **/
164 static void
165 test_scroll_event_emits_mouse_wheel_scroll ()
166 {
167         printf ("test_scroll_event_emits_mouse_wheel_scroll\n");
168         GtkWidget *view = gtk_image_view_new ();
169     g_object_ref (view);
170     gtk_object_sink (GTK_OBJECT (view));
171
172         g_signal_connect (G_OBJECT (view), "mouse_wheel_scroll",
173                                           G_CALLBACK (mouse_wheel_scroll_cb), NULL);
174
175        
176         GdkEventScroll ev;
177         gboolean retval;
178
179         /* Should cause mouse_wheel_scroll -- state is 0. */
180         ev.direction = GDK_SCROLL_DOWN;
181         ev.state = 0;
182         num_calls = 0;
183         g_signal_emit_by_name (view, "scroll-event", &ev, &retval);
184         assert (gotten_dir == GDK_SCROLL_DOWN);
185         assert (num_calls == 1);
186
187         /* Should not cause mouse_wheel_scroll. */
188         ev.state = GDK_CONTROL_MASK;
189         num_calls = 0;
190         g_signal_emit_by_name (view, "scroll-event", &ev, &retval);
191         assert (num_calls == 0);
192        
193         gtk_widget_destroy (view);
194     g_object_unref (view);
195 }
196
197 /**
198  * test_scroll_event_updates_zoom:
199  *
200  * The objective of this test is to verify that the zoom is updated
201  * when the mouse wheel is scrolled while ctrl is pressed.
202  **/
203  
204 static void
205 test_scroll_event_updates_zoom ()
206 {
207         printf ("test_scroll_event_updates_zoom\n");
208         GtkImageView *view = GTK_IMAGE_VIEW (gtk_image_view_new ());
209     g_object_ref (view);
210     gtk_object_sink (GTK_OBJECT (view));
211
212         assert (gtk_image_view_get_zoom (view) == 1.0);
213
214         GdkEventScroll ev;
215         gboolean retval;
216        
217         /* Test zoom in. */
218         ev.direction = GDK_SCROLL_UP;
219         ev.state = GDK_CONTROL_MASK;
220         g_signal_emit_by_name (view, "scroll-event", &ev, &retval);
221         assert (gtk_image_view_get_zoom (view) > 1.0);
222
223         gtk_image_view_set_zoom (view, 1.0);
224
225         /* Test zoom out. */
226         ev.direction = GDK_SCROLL_DOWN;
227         g_signal_emit_by_name (view, "scroll-event", &ev, &retval);
228         assert (gtk_image_view_get_zoom (view) < 1.0);
229
230         gtk_widget_destroy (GTK_WIDGET (view));
231     g_object_unref (view);
232 }
233
234 /**
235  * test_pixbuf_changed_emitted_by_setting_pixbuf:
236  *
237  * The objective of this test is to verify that the pixbuf-changed
238  * signal is emitted whenever gtk_image_view_set_pixbuf() is called.
239  **/
240 static void
241 test_pixbuf_changed_emitted_by_setting_pixbuf ()
242 {
243     printf ("test_pixbuf_changed_emitted_by_setting_pixbuf\n");
244     GtkWidget *view = GTK_WIDGET (gtk_image_view_new ());
245     g_object_ref (view);
246     gtk_object_sink (GTK_OBJECT (view));
247
248     g_signal_connect (G_OBJECT (view), "pixbuf-changed",
249                       G_CALLBACK (pixbuf_changed_cb), NULL);
250
251     /* We set the same pixbuf five times, five signals are emitted. */
252     GdkPixbuf *pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, FALSE, 8, 5, 5);
253     for (int n = 0; n < 5; n++)
254         gtk_image_view_set_pixbuf (GTK_IMAGE_VIEW (view), pixbuf, TRUE);
255     assert (num_calls == 5);
256
257     g_object_unref (pixbuf);
258     gtk_widget_destroy (view);
259     g_object_unref (view);
260 }
261
262 /**
263  * test_set_null_scroll_adjustments:
264  *
265  * The objective of this test is to verify that setting GtkImageView:s
266  * scroll adjustments to NULL works as expected.
267  *
268  * A GtkScrolledWindow sets its childs scroll adjustments to NULL when
269  * it removes it, that is why GtkImageView must handle it.
270  **/
271 static void
272 test_set_null_scroll_adjustments ()
273 {
274     printf ("test_set_null_scroll_adjustments\n");
275     GtkWidget *view = GTK_WIDGET (gtk_image_view_new ());
276     g_object_ref (view);
277     gtk_object_sink (GTK_OBJECT (view));
278
279     gtk_widget_set_scroll_adjustments (view, NULL, NULL);
280
281     gtk_widget_destroy (view);
282     g_object_unref (view);
283 }
284
285 int
286 main (int argc, char *argv[])
287 {
288     gtk_init (&argc, &argv);
289     test_zoom_changed_emitted_by_setting_zoom ();
290     test_not_zoom_changed_emitted_by_setting_equal_zoom ();
291     test_zoom_changed_emitted_by_size_allocate ();
292     test_scroll_event_emits_mouse_wheel_scroll ();
293     test_scroll_event_updates_zoom ();
294     test_pixbuf_changed_emitted_by_setting_pixbuf ();
295     test_set_null_scroll_adjustments ();
296     printf ("7 tests passed.\n");
297 }
Note: See TracBrowser for help on using the browser.