2 * Copyright (C) 2011 Red Hat Inc.
5 * Matthias Clasen <mclasen@redhat.com>
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Library General Public
9 * License as published by the Free Software Foundation; either
10 * version 2 of the License, or (at your option) any later version.
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Library General Public License for more details.
17 * You should have received a copy of the GNU Library General Public
18 * License along with this library; if not, write to the
19 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20 * Boston, MA 02111-1307, USA.
27 const gchar list_ui[] =
29 " <object class='GtkListStore' id='liststore1'>"
31 " <column type='gchararray'/>"
32 " <column type='gchararray'/>"
33 " <column type='gchararray'/>"
34 " <column type='gboolean'/>"
35 " <column type='gint'/>"
36 " <column type='gint'/>"
39 " <row><col id='0'>One</col><col id='1'>Two</col><col id='2'>Three</col><col id='3'>True</col><col id='4'>50</col><col id='5'>50</col></row>"
42 " <object class='GtkWindow' id='window1'>"
44 " <object class='GtkTreeView' id='treeview1'>"
45 " <property name='visible'>True</property>"
46 " <property name='model'>liststore1</property>"
48 " <object class='GtkTreeViewColumn' id='column1'>"
49 " <property name='title' translatable='yes'>First column</property>"
51 " <object class='GtkCellRendererText' id='renderer1'>"
54 " <attribute name='text'>0</attribute>"
58 " <object class='GtkCellRendererToggle' id='renderer2'>"
61 " <attribute name='active'>3</attribute>"
67 " <object class='GtkTreeViewColumn' id='column2'>"
68 " <property name='title' translatable='yes'>Second column</property>"
70 " <object class='GtkCellRendererText' id='renderer3'>"
73 " <attribute name='text'>1</attribute>"
77 " <object class='GtkCellRendererProgress' id='renderer4'>"
80 " <attribute name='value'>4</attribute>"
91 walk_accessible_tree (AtkObject *accessible,
99 for (i = 0; i < atk_object_get_n_accessible_children (accessible); i++)
101 AtkObject *child = atk_object_ref_accessible_child (accessible, i);
102 walk_accessible_tree (child, data);
103 g_object_unref (child);
108 builder_get_toplevel (GtkBuilder *builder)
111 GtkWidget *window = NULL;
113 list = gtk_builder_get_objects (builder);
114 for (walk = list; walk; walk = walk->next)
116 if (GTK_IS_WINDOW (walk->data) &&
117 gtk_widget_get_parent (walk->data) == NULL)
130 populate_list (GtkBuilder *builder)
137 tv = (GtkTreeView *)gtk_builder_get_object (builder, "treeview1");
138 store = (GtkListStore *)gtk_tree_view_get_model (tv);
140 /* append a many rows */
141 for (i = 0; i < N_ROWS; i++)
143 gtk_list_store_append (store, &iter);
144 gtk_list_store_set (store, &iter, 0, "Bla", 1, "Bla bla", 2, "Bla bla bla", 3, i % 2 == 0 ? TRUE : FALSE, 4, i % 100, 5, i, -1);
149 test_performance_list (void)
154 GError *error = NULL;
156 builder = gtk_builder_new ();
157 gtk_builder_add_from_string (builder, list_ui, -1, &error);
158 g_assert_no_error (error);
159 window = builder_get_toplevel (builder);
162 gtk_widget_show (window);
164 g_test_timer_start ();
166 populate_list (builder);
168 elapsed = g_test_timer_elapsed ();
169 g_test_minimized_result (elapsed, "large list test: %gsec", elapsed);
170 g_object_unref (builder);
174 test_a11y_performance_list (void)
179 GError *error = NULL;
183 builder = gtk_builder_new ();
184 gtk_builder_add_from_string (builder, list_ui, -1, &error);
185 g_assert_no_error (error);
186 window = builder_get_toplevel (builder);
189 gtk_widget_show (window);
191 g_test_timer_start ();
193 /* make sure all accessibles exist */
195 walk_accessible_tree (gtk_widget_get_accessible (window), &count_before);
197 populate_list (builder);
199 /* for good measure, do this again */
201 walk_accessible_tree (gtk_widget_get_accessible (window), &count_after);
203 elapsed = g_test_timer_elapsed ();
204 g_test_minimized_result (elapsed, "large list with a11y: %gsec", elapsed);
205 g_object_unref (builder);
207 g_test_message ("%d accessibles before, %d after\n", count_before, count_after);
210 const gchar tree_ui[] =
212 " <object class='GtkTreeStore' id='treestore1'>"
214 " <column type='gchararray'/>"
215 " <column type='gchararray'/>"
216 " <column type='gchararray'/>"
217 " <column type='gboolean'/>"
218 " <column type='gint'/>"
219 " <column type='gint'/>"
222 " <object class='GtkWindow' id='window1'>"
224 " <object class='GtkTreeView' id='treeview1'>"
225 " <property name='visible'>True</property>"
226 " <property name='model'>treestore1</property>"
228 " <object class='GtkTreeViewColumn' id='column1'>"
229 " <property name='title' translatable='yes'>First column</property>"
231 " <object class='GtkCellRendererText' id='renderer1'>"
234 " <attribute name='text'>0</attribute>"
238 " <object class='GtkCellRendererToggle' id='renderer2'>"
241 " <attribute name='active'>3</attribute>"
247 " <object class='GtkTreeViewColumn' id='column2'>"
248 " <property name='title' translatable='yes'>Second column</property>"
250 " <object class='GtkCellRendererText' id='renderer3'>"
253 " <attribute name='text'>1</attribute>"
257 " <object class='GtkCellRendererProgress' id='renderer4'>"
260 " <attribute name='value'>4</attribute>"
271 populate_tree (GtkBuilder *builder)
278 tv = (GtkTreeView *)gtk_builder_get_object (builder, "treeview1");
279 store = (GtkTreeStore *)gtk_tree_view_get_model (tv);
281 /* append a thousand rows */
282 for (i = 0; i < N_ROWS / 3; i++)
284 gtk_tree_store_append (store, &iter, NULL);
285 gtk_tree_store_set (store, &iter, 0, "Bla", 1, "Bla bla", 2, "Bla bla bla", 3, i % 2 == 0 ? TRUE : FALSE, 4, i % 100, 5, i, -1);
286 gtk_tree_store_append (store, &iter, &iter);
287 gtk_tree_store_set (store, &iter, 0, "Bla", 1, "Bla bla", 2, "Bla bla bla", 3, i % 2 == 0 ? TRUE : FALSE, 4, i % 100, 5, i, -1);
288 gtk_tree_store_append (store, &iter, &iter);
289 gtk_tree_store_set (store, &iter, 0, "Bla", 1, "Bla bla", 2, "Bla bla bla", 3, i % 2 == 0 ? TRUE : FALSE, 4, i % 100, 5, i, -1);
292 gtk_tree_view_expand_all (tv);
296 test_performance_tree (void)
301 GError *error = NULL;
303 builder = gtk_builder_new ();
304 gtk_builder_add_from_string (builder, tree_ui, -1, &error);
305 g_assert_no_error (error);
306 window = builder_get_toplevel (builder);
309 gtk_widget_show (window);
311 g_test_timer_start ();
313 populate_tree (builder);
315 elapsed = g_test_timer_elapsed ();
316 g_test_minimized_result (elapsed, "large tree test: %gsec", elapsed);
317 g_object_unref (builder);
321 test_a11y_performance_tree (void)
326 GError *error = NULL;
330 builder = gtk_builder_new ();
331 gtk_builder_add_from_string (builder, tree_ui, -1, &error);
332 g_assert_no_error (error);
333 window = builder_get_toplevel (builder);
336 gtk_widget_show (window);
338 g_test_timer_start ();
340 /* make sure all accessibles exist */
342 walk_accessible_tree (gtk_widget_get_accessible (window), &count_before);
344 populate_tree (builder);
346 /* for good measure, do this again */
348 walk_accessible_tree (gtk_widget_get_accessible (window), &count_after);
350 elapsed = g_test_timer_elapsed ();
351 g_test_minimized_result (elapsed, "large tree with a11y: %gsec", elapsed);
352 g_object_unref (builder);
354 g_test_message ("%d accessibles before, %d after\n", count_before, count_after);
358 main (int argc, char *argv[])
360 gtk_test_init (&argc, &argv, NULL);
365 g_test_add_func ("/performance/list", test_performance_list);
366 g_test_add_func ("/a11y/performance/list", test_a11y_performance_list);
367 g_test_add_func ("/performance/tree", test_performance_tree);
368 g_test_add_func ("/a11y/performance/tree", test_a11y_performance_tree);
370 return g_test_run ();