1#include <gtk/gtk.h>
2
3#include <string.h>
4
5#define SCALABLE_IMAGE_SIZE (128)
6
7static GtkIconTheme *
8get_test_icontheme (gboolean force_reload)
9{
10 static GtkIconTheme *icon_theme = NULL;
11 const char *current_dir[2];
12
13 if (force_reload)
14 g_clear_object (&icon_theme);
15
16 if (icon_theme)
17 return icon_theme;
18
19 icon_theme = gtk_icon_theme_new ();
20 gtk_icon_theme_set_theme_name (self: icon_theme, theme_name: "icons");
21 current_dir[0] = g_test_get_dir (file_type: G_TEST_DIST);
22 current_dir[1] = NULL;
23 gtk_icon_theme_set_search_path (self: icon_theme, path: current_dir);
24
25 return icon_theme;
26}
27
28static char *
29lookup_flags_to_string (GtkIconLookupFlags flags)
30{
31 GValue flags_value = { 0, }, string_value = { 0, };
32 char *result;
33
34 g_value_init (value: &flags_value, g_type: GTK_TYPE_ICON_LOOKUP_FLAGS);
35 g_value_init (value: &string_value, G_TYPE_STRING);
36
37 g_value_set_flags (value: &flags_value, v_flags: flags);
38 if (!g_value_transform (src_value: &flags_value, dest_value: &string_value))
39 {
40 g_assert_not_reached ();
41 }
42
43 result = g_value_dup_string (value: &string_value);
44
45 g_value_unset (value: &flags_value);
46 g_value_unset (value: &string_value);
47
48 return result;
49}
50
51static void
52assert_icon_lookup_size (const char *icon_name,
53 int size,
54 GtkTextDirection direction,
55 GtkIconLookupFlags flags,
56 gboolean fallbacks,
57 const char *filename,
58 int pixbuf_size)
59{
60 GtkIconPaintable *info;
61 GFile *file;
62 char *path = NULL;
63
64 if (fallbacks)
65 {
66 GThemedIcon *fallback_icons = G_THEMED_ICON (g_themed_icon_new_with_default_fallbacks (icon_name));
67 const char **fallback_names = (const char **) g_themed_icon_get_names (icon: fallback_icons);
68 info = gtk_icon_theme_lookup_icon (self: get_test_icontheme (FALSE), icon_name, fallbacks: &fallback_names[1], size, scale: 1, direction, flags);
69 g_object_unref (object: fallback_icons);
70 }
71 else
72 {
73 info = gtk_icon_theme_lookup_icon (self: get_test_icontheme (FALSE), icon_name, NULL, size, scale: 1, direction, flags);
74 }
75
76 if (info == NULL)
77 {
78 g_error ("Could not look up an icon for \"%s\" with flags %s at size %d",
79 icon_name, lookup_flags_to_string (flags), size);
80 return;
81 }
82
83 file = gtk_icon_paintable_get_file (self: info);
84 if (file)
85 {
86 path = g_file_get_path (file);
87 g_object_unref (object: file);
88 }
89
90 if (filename)
91 {
92 if (path == NULL || !g_str_has_suffix (str: path, suffix: filename))
93 {
94 g_error ("Icon for \"%s\" with flags %s at size %d should be \"...%s\" but is \"...%s\"",
95 icon_name, lookup_flags_to_string (flags), size,
96 filename, path);
97 return;
98 }
99 }
100 else
101 {
102 g_assert_null (path);
103 }
104
105 g_free (mem: path);
106
107 g_assert_cmpint (gdk_paintable_get_intrinsic_width (GDK_PAINTABLE (info)), ==, size);
108
109 g_object_unref (object: info);
110}
111
112static void
113assert_icon_lookup (const char *icon_name,
114 int size,
115 GtkTextDirection direction,
116 GtkIconLookupFlags flags,
117 gboolean fallbacks,
118 const char *filename)
119{
120 assert_icon_lookup_size (icon_name, size, direction, flags, fallbacks, filename, pixbuf_size: -1);
121}
122
123static void
124assert_icon_lookup_fails (const char *icon_name,
125 int size,
126 GtkTextDirection direction,
127 GtkIconLookupFlags flags)
128{
129 GtkIconPaintable *info;
130
131 info = gtk_icon_theme_lookup_icon (self: get_test_icontheme (FALSE), icon_name, NULL, size, scale: 1, direction, flags);
132
133 /* We never truly *fail*, but check that we got the image-missing fallback */
134 g_assert_nonnull (info);
135 g_assert_cmpstr (gtk_icon_paintable_get_icon_name (info), ==, "image-missing");
136}
137
138static GList *lookups = NULL;
139static gboolean collecting_lookups = FALSE;
140
141static GLogWriterOutput
142log_writer (GLogLevelFlags log_level,
143 const GLogField *fields,
144 gsize n_fields,
145 gpointer user_data)
146{
147 const char *domain = NULL;
148 const char *msg = NULL;
149 int i;
150
151 if (!collecting_lookups)
152 return g_log_writer_default (log_level, fields, n_fields, user_data);
153
154 for (i = 0; i < n_fields; i++)
155 {
156 if (strcmp (s1: fields[i].key, s2: "GLIB_DOMAIN") == 0)
157 domain = fields[i].value;
158 if (strcmp (s1: fields[i].key, s2: "MESSAGE") == 0)
159 msg = fields[i].value;
160 }
161
162 if (log_level != G_LOG_LEVEL_MESSAGE || g_strcmp0 (str1: domain, str2: "Gtk") != 0)
163 return g_log_writer_default (log_level, fields, n_fields, user_data);
164
165 if (g_str_has_prefix (str: msg, prefix: "\tlookup name: "))
166 {
167 char *s;
168 s = g_strchomp (string: g_strdup (str: msg + strlen (s: "\tlookup name: ")));
169 lookups = g_list_append (list: lookups, data: s);
170 }
171
172 return G_LOG_WRITER_HANDLED;
173}
174
175static void
176assert_lookup_order (const char *icon_name,
177 int size,
178 GtkTextDirection direction,
179 GtkIconLookupFlags flags,
180 gboolean fallbacks,
181 const char *first,
182 ...)
183{
184 va_list args;
185 const char *s;
186 GtkIconPaintable *info;
187 GList *l;
188
189 g_assert_null (lookups);
190 collecting_lookups = TRUE;
191
192 if (fallbacks)
193 {
194 GThemedIcon *fallback_icons = G_THEMED_ICON (g_themed_icon_new_with_default_fallbacks (icon_name));
195 const char **fallback_names = (const char **) g_themed_icon_get_names (icon: fallback_icons);
196 info = gtk_icon_theme_lookup_icon (self: get_test_icontheme (FALSE), icon_name, fallbacks: &fallback_names[1], size, scale: 1, direction, flags);
197 g_object_unref (object: fallback_icons);
198 }
199 else
200 {
201 info = gtk_icon_theme_lookup_icon (self: get_test_icontheme (FALSE), icon_name, NULL, size, scale: 1, direction, flags);
202 }
203
204 if (info)
205 g_object_unref (object: info);
206
207 collecting_lookups = FALSE;
208
209 va_start (args, first);
210 s = first;
211 l = lookups;
212 while (s != NULL)
213 {
214 g_assert_nonnull (l);
215 g_assert_cmpstr (s, ==, l->data);
216 s = va_arg (args, char *);
217 l = l->next;
218 }
219 g_assert_null (l);
220 va_end (args);
221
222 g_list_free_full (list: lookups, free_func: g_free);
223 lookups = NULL;
224}
225
226#ifdef G_ENABLE_DEBUG
227#define require_debug()
228#else
229#define require_debug() \
230 g_test_skip ("requires G_ENABLE_DEBUG"); \
231 return;
232#endif
233
234static void
235test_lookup_order (void)
236{
237 require_debug ();
238
239 if (g_test_subprocess ())
240 {
241 guint debug_flags;
242
243 debug_flags = gtk_get_debug_flags ();
244 gtk_set_debug_flags (flags: debug_flags | GTK_DEBUG_ICONTHEME);
245
246 g_log_set_writer_func (func: log_writer, NULL, NULL);
247
248 assert_lookup_order (icon_name: "foo-bar-baz", size: 16, direction: GTK_TEXT_DIR_NONE, flags: 0, TRUE,
249 first: "foo-bar-baz",
250 "foo-bar",
251 "foo",
252 "foo-bar-baz-symbolic",
253 "foo-bar-symbolic",
254 "foo-symbolic",
255 NULL);
256 assert_lookup_order (icon_name: "foo-bar-baz", size: 16, direction: GTK_TEXT_DIR_RTL, flags: 0, TRUE,
257 first: "foo-bar-baz-rtl",
258 "foo-bar-baz",
259 "foo-bar-rtl",
260 "foo-bar",
261 "foo-rtl",
262 "foo",
263 "foo-bar-baz-symbolic-rtl",
264 "foo-bar-baz-symbolic",
265 "foo-bar-symbolic-rtl",
266 "foo-bar-symbolic",
267 "foo-symbolic-rtl",
268 "foo-symbolic",
269 NULL);
270 assert_lookup_order (icon_name: "foo-bar-baz", size: 16, direction: GTK_TEXT_DIR_RTL, flags: 0, FALSE,
271 first: "foo-bar-baz-rtl",
272 "foo-bar-baz",
273 NULL);
274 assert_lookup_order (icon_name: "foo-bar-baz-symbolic", size: 16, direction: GTK_TEXT_DIR_NONE, flags: 0, TRUE,
275 first: "foo-bar-baz-symbolic",
276 "foo-bar-symbolic",
277 "foo-symbolic",
278 "foo-bar-baz",
279 "foo-bar",
280 "foo",
281 NULL);
282
283 assert_lookup_order (icon_name: "bla-bla", size: 16, direction: GTK_TEXT_DIR_NONE, flags: GTK_ICON_LOOKUP_FORCE_SYMBOLIC, TRUE,
284 first: "bla-bla-symbolic",
285 "bla-symbolic",
286 "bla-bla-symbolic", /* awkward */
287 "bla-symbolic", /* awkward */
288 "bla-bla",
289 "bla",
290 NULL);
291 assert_lookup_order (icon_name: "bla-bla-symbolic", size: 16, direction: GTK_TEXT_DIR_NONE, flags: GTK_ICON_LOOKUP_FORCE_SYMBOLIC, TRUE,
292 first: "bla-bla-symbolic",
293 "bla-symbolic",
294 "bla-bla-symbolic", /* awkward */
295 "bla-symbolic", /* awkward */
296 "bla-bla",
297 "bla",
298 NULL);
299
300 assert_lookup_order (icon_name: "bar-baz", size: 16, direction: GTK_TEXT_DIR_RTL, flags: GTK_ICON_LOOKUP_FORCE_SYMBOLIC, TRUE,
301 first: "bar-baz-symbolic-rtl",
302 "bar-baz-symbolic",
303 "bar-symbolic-rtl",
304 "bar-symbolic",
305 "bar-baz-symbolic-rtl", /* awkward */
306 "bar-baz-symbolic", /* awkward */
307 "bar-symbolic-rtl", /* awkward */
308 "bar-symbolic", /* awkward */
309 "bar-baz-rtl",
310 "bar-baz",
311 "bar-rtl",
312 "bar",
313 NULL);
314 assert_lookup_order (icon_name: "bar-baz-symbolic", size: 16, direction: GTK_TEXT_DIR_RTL, flags: GTK_ICON_LOOKUP_FORCE_SYMBOLIC, TRUE,
315 first: "bar-baz-symbolic-rtl",
316 "bar-baz-symbolic",
317 "bar-symbolic-rtl",
318 "bar-symbolic",
319 "bar-baz-symbolic-rtl", /* awkward */
320 "bar-baz-symbolic", /* awkward */
321 "bar-symbolic-rtl", /* awkward */
322 "bar-symbolic", /* awkward */
323 "bar-baz-rtl",
324 "bar-baz",
325 "bar-rtl",
326 "bar",
327 NULL);
328
329 assert_lookup_order (icon_name: "bar-baz", size: 16, direction: GTK_TEXT_DIR_LTR, flags: GTK_ICON_LOOKUP_FORCE_SYMBOLIC, TRUE,
330 first: "bar-baz-symbolic-ltr",
331 "bar-baz-symbolic",
332 "bar-symbolic-ltr",
333 "bar-symbolic",
334 "bar-baz-symbolic-ltr", /* awkward */
335 "bar-baz-symbolic", /* awkward */
336 "bar-symbolic-ltr", /* awkward */
337 "bar-symbolic", /* awkward */
338 "bar-baz-ltr",
339 "bar-baz",
340 "bar-ltr",
341 "bar",
342 NULL);
343 assert_lookup_order (icon_name: "bar-baz-symbolic", size: 16, direction: GTK_TEXT_DIR_LTR, flags: GTK_ICON_LOOKUP_FORCE_SYMBOLIC, TRUE,
344 first: "bar-baz-symbolic-ltr",
345 "bar-baz-symbolic",
346 "bar-symbolic-ltr",
347 "bar-symbolic",
348 "bar-baz-symbolic-ltr", /* awkward */
349 "bar-baz-symbolic", /* awkward */
350 "bar-symbolic-ltr", /* awkward */
351 "bar-symbolic", /* awkward */
352 "bar-baz-ltr",
353 "bar-baz",
354 "bar-ltr",
355 "bar",
356 NULL);
357
358 return;
359 }
360
361 g_test_trap_subprocess (NULL, usec_timeout: 0, test_flags: 0);
362 g_test_trap_has_passed ();
363}
364
365static void
366test_basics (void)
367{
368 /* just a basic boring lookup so we know everything works */
369 assert_icon_lookup (icon_name: "simple", size: 16, direction: GTK_TEXT_DIR_NONE, flags: 0, FALSE, filename: "/icons/16x16/simple.png");
370}
371
372static void
373test_generic_fallback (void)
374{
375 /* simple test for generic fallback */
376 assert_icon_lookup (icon_name: "simple-foo-bar",
377 size: 16,
378 direction: GTK_TEXT_DIR_NONE,
379 flags: 0,
380 TRUE,
381 filename: "/icons/16x16/simple.png");
382
383 /* Check generic fallback also works for symbolics falling back to regular items */
384 assert_icon_lookup (icon_name: "simple-foo-bar-symbolic",
385 size: 16,
386 direction: GTK_TEXT_DIR_NONE,
387 flags: 0,
388 TRUE,
389 filename: "/icons/16x16/simple.png");
390
391 /* Check we fall back to more generic symbolic icons before falling back to
392 * non-symbolics */
393 assert_icon_lookup (icon_name: "everything-justregular-symbolic",
394 SCALABLE_IMAGE_SIZE,
395 direction: GTK_TEXT_DIR_NONE,
396 flags: 0,
397 TRUE,
398 filename: "/icons/scalable/everything-symbolic.svg");
399}
400
401static void
402test_force_symbolic (void)
403{
404 /* check forcing symbolic works */
405 assert_icon_lookup (icon_name: "everything",
406 SCALABLE_IMAGE_SIZE,
407 direction: GTK_TEXT_DIR_NONE,
408 flags: GTK_ICON_LOOKUP_FORCE_SYMBOLIC,
409 FALSE,
410 filename: "/icons/scalable/everything-symbolic.svg");
411 /* check forcing symbolic also works for symbolic icons (d'oh) */
412 assert_icon_lookup (icon_name: "everything-symbolic",
413 SCALABLE_IMAGE_SIZE,
414 direction: GTK_TEXT_DIR_NONE,
415 flags: GTK_ICON_LOOKUP_FORCE_SYMBOLIC,
416 FALSE,
417 filename: "/icons/scalable/everything-symbolic.svg");
418
419 /* check all the combos for fallbacks on an icon that only exists as symbolic */
420 assert_icon_lookup (icon_name: "everything-justsymbolic",
421 SCALABLE_IMAGE_SIZE,
422 direction: GTK_TEXT_DIR_NONE,
423 flags: GTK_ICON_LOOKUP_FORCE_SYMBOLIC,
424 FALSE,
425 filename: "/icons/scalable/everything-justsymbolic-symbolic.svg");
426 assert_icon_lookup (icon_name: "everything-justsymbolic",
427 SCALABLE_IMAGE_SIZE,
428 direction: GTK_TEXT_DIR_NONE,
429 flags: GTK_ICON_LOOKUP_FORCE_SYMBOLIC,
430 TRUE,
431 filename: "/icons/scalable/everything-justsymbolic-symbolic.svg");
432 assert_icon_lookup (icon_name: "everything-justsymbolic-symbolic",
433 SCALABLE_IMAGE_SIZE,
434 direction: GTK_TEXT_DIR_NONE,
435 flags: GTK_ICON_LOOKUP_FORCE_SYMBOLIC,
436 FALSE,
437 filename: "/icons/scalable/everything-justsymbolic-symbolic.svg");
438 assert_icon_lookup (icon_name: "everything-justsymbolic-symbolic",
439 SCALABLE_IMAGE_SIZE,
440 direction: GTK_TEXT_DIR_NONE,
441 flags: GTK_ICON_LOOKUP_FORCE_SYMBOLIC,
442 TRUE,
443 filename: "/icons/scalable/everything-justsymbolic-symbolic.svg");
444
445 /* check all the combos for fallbacks, this time for an icon that only exists as regular */
446 assert_icon_lookup (icon_name: "everything-justregular",
447 SCALABLE_IMAGE_SIZE,
448 direction: GTK_TEXT_DIR_NONE,
449 flags: GTK_ICON_LOOKUP_FORCE_SYMBOLIC,
450 FALSE,
451 filename: "/icons/scalable/everything-justregular.svg");
452 assert_icon_lookup (icon_name: "everything-justregular",
453 SCALABLE_IMAGE_SIZE,
454 direction: GTK_TEXT_DIR_NONE,
455 flags: GTK_ICON_LOOKUP_FORCE_SYMBOLIC,
456 TRUE,
457 filename: "/icons/scalable/everything-symbolic.svg");
458 assert_icon_lookup_fails (icon_name: "everything-justregular-symbolic",
459 SCALABLE_IMAGE_SIZE,
460 direction: GTK_TEXT_DIR_NONE,
461 flags: GTK_ICON_LOOKUP_FORCE_SYMBOLIC);
462 assert_icon_lookup (icon_name: "everything-justregular-symbolic",
463 SCALABLE_IMAGE_SIZE,
464 direction: GTK_TEXT_DIR_NONE,
465 flags: GTK_ICON_LOOKUP_FORCE_SYMBOLIC,
466 TRUE,
467 filename: "/icons/scalable/everything-symbolic.svg");
468}
469
470static void
471test_force_regular (void)
472{
473 /* check forcing regular works (d'oh) */
474 assert_icon_lookup (icon_name: "everything",
475 SCALABLE_IMAGE_SIZE,
476 direction: GTK_TEXT_DIR_NONE,
477 flags: GTK_ICON_LOOKUP_FORCE_REGULAR,
478 FALSE,
479 filename: "/icons/scalable/everything.svg");
480 /* check forcing regular also works for symbolic icons ) */
481 assert_icon_lookup (icon_name: "everything-symbolic",
482 SCALABLE_IMAGE_SIZE,
483 direction: GTK_TEXT_DIR_NONE,
484 flags: GTK_ICON_LOOKUP_FORCE_REGULAR,
485 FALSE,
486 filename: "/icons/scalable/everything.svg");
487
488 /* check all the combos for fallbacks on an icon that only exists as regular */
489 assert_icon_lookup (icon_name: "everything-justregular",
490 SCALABLE_IMAGE_SIZE,
491 direction: GTK_TEXT_DIR_NONE,
492 flags: GTK_ICON_LOOKUP_FORCE_REGULAR,
493 FALSE,
494 filename: "/icons/scalable/everything-justregular.svg");
495 assert_icon_lookup (icon_name: "everything-justregular",
496 SCALABLE_IMAGE_SIZE,
497 direction: GTK_TEXT_DIR_NONE,
498 flags: GTK_ICON_LOOKUP_FORCE_REGULAR,
499 TRUE,
500 filename: "/icons/scalable/everything-justregular.svg");
501 assert_icon_lookup (icon_name: "everything-justregular-symbolic",
502 SCALABLE_IMAGE_SIZE,
503 direction: GTK_TEXT_DIR_NONE,
504 flags: GTK_ICON_LOOKUP_FORCE_REGULAR,
505 FALSE,
506 filename: "/icons/scalable/everything-justregular.svg");
507 assert_icon_lookup (icon_name: "everything-justregular-symbolic",
508 SCALABLE_IMAGE_SIZE,
509 direction: GTK_TEXT_DIR_NONE,
510 flags: GTK_ICON_LOOKUP_FORCE_REGULAR,
511 TRUE,
512 filename: "/icons/scalable/everything-justregular.svg");
513
514 /* check all the combos for fallbacks, this time for an icon that only exists as symbolic */
515 assert_icon_lookup_fails (icon_name: "everything-justsymbolic",
516 SCALABLE_IMAGE_SIZE,
517 direction: GTK_TEXT_DIR_NONE,
518 flags: GTK_ICON_LOOKUP_FORCE_REGULAR);
519 assert_icon_lookup (icon_name: "everything-justsymbolic",
520 SCALABLE_IMAGE_SIZE,
521 direction: GTK_TEXT_DIR_NONE,
522 flags: GTK_ICON_LOOKUP_FORCE_REGULAR,
523 TRUE,
524 filename: "/icons/scalable/everything.svg");
525 assert_icon_lookup (icon_name: "everything-justsymbolic-symbolic",
526 SCALABLE_IMAGE_SIZE,
527 direction: GTK_TEXT_DIR_NONE,
528 flags: GTK_ICON_LOOKUP_FORCE_REGULAR,
529 FALSE,
530 filename: "/icons/scalable/everything-justsymbolic-symbolic.svg");
531 assert_icon_lookup (icon_name: "everything-justsymbolic-symbolic",
532 SCALABLE_IMAGE_SIZE,
533 direction: GTK_TEXT_DIR_NONE,
534 flags: GTK_ICON_LOOKUP_FORCE_REGULAR,
535 TRUE,
536 filename: "/icons/scalable/everything.svg");
537}
538
539static void
540test_rtl (void)
541{
542 assert_icon_lookup (icon_name: "everything",
543 SCALABLE_IMAGE_SIZE,
544 direction: GTK_TEXT_DIR_RTL,
545 flags: 0,
546 FALSE,
547 filename: "/icons/scalable/everything-rtl.svg");
548 assert_icon_lookup (icon_name: "everything-symbolic",
549 SCALABLE_IMAGE_SIZE,
550 direction: GTK_TEXT_DIR_RTL,
551 flags: 0,
552 FALSE,
553 filename: "/icons/scalable/everything-symbolic-rtl.svg");
554
555 assert_icon_lookup_fails (icon_name: "everything-justrtl",
556 SCALABLE_IMAGE_SIZE,
557 direction: GTK_TEXT_DIR_NONE,
558 flags: 0);
559 assert_icon_lookup_fails (icon_name: "everything-justrtl",
560 SCALABLE_IMAGE_SIZE,
561 direction: GTK_TEXT_DIR_LTR,
562 flags: 0);
563 assert_icon_lookup (icon_name: "everything-justrtl",
564 SCALABLE_IMAGE_SIZE,
565 direction: GTK_TEXT_DIR_RTL,
566 flags: 0,
567 FALSE,
568 filename: "/icons/scalable/everything-justrtl-rtl.svg");
569
570 assert_icon_lookup (icon_name: "everything-justrtl",
571 SCALABLE_IMAGE_SIZE,
572 direction: GTK_TEXT_DIR_NONE,
573 flags: 0,
574 TRUE,
575 filename: "/icons/scalable/everything.svg");
576 assert_icon_lookup (icon_name: "everything-justrtl",
577 SCALABLE_IMAGE_SIZE,
578 direction: GTK_TEXT_DIR_LTR,
579 flags: 0,
580 TRUE,
581 filename: "/icons/scalable/everything.svg");
582 assert_icon_lookup (icon_name: "everything-justrtl",
583 SCALABLE_IMAGE_SIZE,
584 direction: GTK_TEXT_DIR_RTL,
585 flags: 0,
586 TRUE,
587 filename: "/icons/scalable/everything-justrtl-rtl.svg");
588}
589
590static void
591test_symbolic_single_size (void)
592{
593 /* Check we properly load a symbolic icon from a sized directory */
594 assert_icon_lookup (icon_name: "only32-symbolic",
595 size: 32,
596 direction: GTK_TEXT_DIR_NONE,
597 flags: 0,
598 FALSE,
599 filename: "/icons/32x32/only32-symbolic.svg");
600 /* Check that we still properly load it even if a different size is requested */
601 assert_icon_lookup (icon_name: "only32-symbolic",
602 size: 16,
603 direction: GTK_TEXT_DIR_NONE,
604 flags: 0,
605 FALSE,
606 filename: "/icons/32x32/only32-symbolic.svg");
607 assert_icon_lookup (icon_name: "only32-symbolic",
608 size: 128,
609 direction: GTK_TEXT_DIR_NONE,
610 flags: 0,
611 FALSE,
612 filename: "/icons/32x32/only32-symbolic.svg");
613}
614
615static void
616test_svg_size (void)
617{
618 /* Check we properly load a svg icon from a sized directory */
619 assert_icon_lookup_size (icon_name: "twosize-fixed", size: 48, direction: GTK_TEXT_DIR_NONE, flags: 0, FALSE, filename: "/icons/32x32/twosize-fixed.svg", pixbuf_size: 48);
620 assert_icon_lookup_size (icon_name: "twosize-fixed", size: 32, direction: GTK_TEXT_DIR_NONE, flags: 0, FALSE, filename: "/icons/32x32/twosize-fixed.svg", pixbuf_size: 32);
621 assert_icon_lookup_size (icon_name: "twosize-fixed", size: 20, direction: GTK_TEXT_DIR_NONE, flags: 0, FALSE, filename: "/icons/32x32/twosize-fixed.svg", pixbuf_size: 20);
622 assert_icon_lookup_size (icon_name: "twosize-fixed", size: 16, direction: GTK_TEXT_DIR_NONE, flags: 0, FALSE, filename: "/icons/16x16/twosize-fixed.svg", pixbuf_size: 16);
623
624 /* Check that we still properly load it even if a different size is requested */
625 assert_icon_lookup_size (icon_name: "twosize", size: 64, direction: GTK_TEXT_DIR_NONE, flags: 0, FALSE, filename: "/icons/32x32s/twosize.svg", pixbuf_size: 64);
626 assert_icon_lookup_size (icon_name: "twosize", size: 48, direction: GTK_TEXT_DIR_NONE, flags: 0, FALSE, filename: "/icons/32x32s/twosize.svg", pixbuf_size: 48);
627 assert_icon_lookup_size (icon_name: "twosize", size: 32, direction: GTK_TEXT_DIR_NONE, flags: 0, FALSE, filename: "/icons/32x32s/twosize.svg", pixbuf_size: 32);
628 assert_icon_lookup_size (icon_name: "twosize", size: 24, direction: GTK_TEXT_DIR_NONE, flags: 0, FALSE, filename: "/icons/32x32s/twosize.svg", pixbuf_size: 24);
629 assert_icon_lookup_size (icon_name: "twosize", size: 16, direction: GTK_TEXT_DIR_NONE, flags: 0, FALSE, filename: "/icons/16x16s/twosize.svg", pixbuf_size: 16);
630 assert_icon_lookup_size (icon_name: "twosize", size: 12, direction: GTK_TEXT_DIR_NONE, flags: 0, FALSE, filename: "/icons/16x16s/twosize.svg", pixbuf_size: 12);
631 assert_icon_lookup_size (icon_name: "twosize", size: 8, direction: GTK_TEXT_DIR_NONE, flags: 0, FALSE, filename: "/icons/16x16s/twosize.svg", pixbuf_size: 8);
632}
633
634static void
635test_size (void)
636{
637 assert_icon_lookup_size (icon_name: "size-test", size: 12, direction: GTK_TEXT_DIR_NONE, flags: 0, FALSE, filename: "/icons/15/size-test.png", pixbuf_size: 15);
638 assert_icon_lookup_size (icon_name: "size-test", size: 13, direction: GTK_TEXT_DIR_NONE, flags: 0, FALSE, filename: "/icons/15/size-test.png", pixbuf_size: 15);
639 assert_icon_lookup_size (icon_name: "size-test", size: 14, direction: GTK_TEXT_DIR_NONE, flags: 0, FALSE, filename: "/icons/15/size-test.png", pixbuf_size: 15);
640 assert_icon_lookup_size (icon_name: "size-test", size: 15, direction: GTK_TEXT_DIR_NONE, flags: 0, FALSE, filename: "/icons/15/size-test.png", pixbuf_size: 15);
641 assert_icon_lookup_size (icon_name: "size-test", size: 16, direction: GTK_TEXT_DIR_NONE, flags: 0, FALSE, filename: "/icons/16-22/size-test.png", pixbuf_size: 19);
642 assert_icon_lookup_size (icon_name: "size-test", size: 17, direction: GTK_TEXT_DIR_NONE, flags: 0, FALSE, filename: "/icons/16-22/size-test.png", pixbuf_size: 19);
643 assert_icon_lookup_size (icon_name: "size-test", size: 18, direction: GTK_TEXT_DIR_NONE, flags: 0, FALSE, filename: "/icons/16-22/size-test.png", pixbuf_size: 19);
644 assert_icon_lookup_size (icon_name: "size-test", size: 19, direction: GTK_TEXT_DIR_NONE, flags: 0, FALSE, filename: "/icons/16-22/size-test.png", pixbuf_size: 19);
645 /* the next 3 are because we never scale up */
646 assert_icon_lookup_size (icon_name: "size-test", size: 20, direction: GTK_TEXT_DIR_NONE, flags: 0, FALSE, filename: "/icons/25+/size-test.svg", pixbuf_size: 20);
647 assert_icon_lookup_size (icon_name: "size-test", size: 21, direction: GTK_TEXT_DIR_NONE, flags: 0, FALSE, filename: "/icons/25+/size-test.svg", pixbuf_size: 21);
648 assert_icon_lookup_size (icon_name: "size-test", size: 22, direction: GTK_TEXT_DIR_NONE, flags: 0, FALSE, filename: "/icons/25+/size-test.svg", pixbuf_size: 22);
649
650 assert_icon_lookup_size (icon_name: "size-test", size: 23, direction: GTK_TEXT_DIR_NONE, flags: 0, FALSE, filename: "/icons/25+/size-test.svg", pixbuf_size: 23);
651 assert_icon_lookup_size (icon_name: "size-test", size: 23, direction: GTK_TEXT_DIR_NONE, flags: 0, FALSE, filename: "/icons/25+/size-test.svg", pixbuf_size: 23);
652 assert_icon_lookup_size (icon_name: "size-test", size: 25, direction: GTK_TEXT_DIR_NONE, flags: 0, FALSE, filename: "/icons/25+/size-test.svg", pixbuf_size: 25);
653 assert_icon_lookup_size (icon_name: "size-test", size: 28, direction: GTK_TEXT_DIR_NONE, flags: 0, FALSE, filename: "/icons/25+/size-test.svg", pixbuf_size: 28);
654 /* the next 2 are because we never scale up */
655 assert_icon_lookup_size (icon_name: "size-test", size: 31, direction: GTK_TEXT_DIR_NONE, flags: 0, FALSE, filename: "/icons/35+/size-test.svg", pixbuf_size: 31);
656 assert_icon_lookup_size (icon_name: "size-test", size: 34, direction: GTK_TEXT_DIR_NONE, flags: 0, FALSE, filename: "/icons/35+/size-test.svg", pixbuf_size: 34);
657
658 assert_icon_lookup_size (icon_name: "size-test", size: 37, direction: GTK_TEXT_DIR_NONE, flags: 0, FALSE, filename: "/icons/35+/size-test.svg", pixbuf_size: 37);
659 assert_icon_lookup_size (icon_name: "size-test", size: 40, direction: GTK_TEXT_DIR_NONE, flags: 0, FALSE, filename: "/icons/35+/size-test.svg", pixbuf_size: 40);
660 assert_icon_lookup_size (icon_name: "size-test", size: 45, direction: GTK_TEXT_DIR_NONE, flags: 0, FALSE, filename: "/icons/35+/size-test.svg", pixbuf_size: 45);
661}
662
663static void
664test_list (void)
665{
666 GtkIconTheme *theme;
667 char **icons;
668
669 theme = get_test_icontheme (TRUE);
670 icons = gtk_icon_theme_get_icon_names (self: theme);
671
672 g_assert_true (g_strv_contains ((const char * const *)icons, "size-test"));
673 g_assert_true (g_strv_contains ((const char * const *)icons, "simple"));
674 g_assert_true (g_strv_contains ((const char * const *)icons, "twosize-fixed"));
675 g_assert_true (g_strv_contains ((const char * const *)icons, "twosize"));
676 g_assert_true (g_strv_contains ((const char * const *)icons, "only32-symbolic"));
677 g_assert_true (g_strv_contains ((const char * const *)icons, "everything"));
678 g_assert_true (g_strv_contains ((const char * const *)icons, "everything-rtl"));
679 g_assert_true (g_strv_contains ((const char * const *)icons, "everything-symbolic"));
680 g_assert_true (g_strv_contains ((const char * const *)icons, "everything-justregular"));
681 g_assert_true (g_strv_contains ((const char * const *)icons, "everything-justrtl-rtl"));
682 g_assert_true (g_strv_contains ((const char * const *)icons, "everything-symbolic-rtl"));
683 g_assert_true (g_strv_contains ((const char * const *)icons, "everything-justsymbolic-symbolic"));
684
685 g_assert_true (gtk_icon_theme_has_icon (theme, "size-test"));
686 g_assert_true (gtk_icon_theme_has_icon (theme, "simple"));
687 g_assert_true (gtk_icon_theme_has_icon (theme, "twosize-fixed"));
688 g_assert_true (gtk_icon_theme_has_icon (theme, "twosize"));
689 g_assert_true (gtk_icon_theme_has_icon (theme, "only32-symbolic"));
690 g_assert_true (gtk_icon_theme_has_icon (theme, "everything"));
691 g_assert_true (gtk_icon_theme_has_icon (theme, "everything-rtl"));
692 g_assert_true (gtk_icon_theme_has_icon (theme, "everything-symbolic"));
693 g_assert_true (gtk_icon_theme_has_icon (theme, "everything-justregular"));
694 g_assert_true (gtk_icon_theme_has_icon (theme, "everything-justrtl-rtl"));
695 g_assert_true (gtk_icon_theme_has_icon (theme, "everything-symbolic-rtl"));
696 g_assert_true (gtk_icon_theme_has_icon (theme, "everything-justsymbolic-symbolic"));
697
698 g_strfreev (str_array: icons);
699}
700
701static void
702test_inherit (void)
703{
704 assert_icon_lookup (icon_name: "one-two-three",
705 SCALABLE_IMAGE_SIZE,
706 direction: GTK_TEXT_DIR_NONE,
707 flags: 0,
708 TRUE,
709 filename: "/icons/scalable/one-two.svg");
710 assert_icon_lookup (icon_name: "one-two-three",
711 SCALABLE_IMAGE_SIZE,
712 direction: GTK_TEXT_DIR_RTL,
713 flags: 0,
714 TRUE,
715 filename: "/icons/scalable/one-two-rtl.svg");
716 assert_icon_lookup (icon_name: "one-two-three-symbolic",
717 SCALABLE_IMAGE_SIZE,
718 direction: GTK_TEXT_DIR_NONE,
719 flags: 0,
720 TRUE,
721 filename: "/icons2/scalable/one-two-three-symbolic.svg");
722 assert_icon_lookup (icon_name: "one-two-three-symbolic",
723 SCALABLE_IMAGE_SIZE,
724 direction: GTK_TEXT_DIR_RTL,
725 flags: 0,
726 TRUE,
727 filename: "/icons2/scalable/one-two-three-symbolic.svg");
728 assert_icon_lookup (icon_name: "one-two-symbolic",
729 SCALABLE_IMAGE_SIZE,
730 direction: GTK_TEXT_DIR_NONE,
731 flags: 0,
732 TRUE,
733 filename: "/icons2/scalable/one-two-symbolic.svg");
734 assert_icon_lookup (icon_name: "one-two-symbolic",
735 SCALABLE_IMAGE_SIZE,
736 direction: GTK_TEXT_DIR_RTL,
737 flags: 0,
738 TRUE,
739 filename: "/icons2/scalable/one-two-symbolic-rtl.svg");
740}
741
742static void
743test_nonsquare_symbolic (void)
744{
745 int width, height, size;
746 GtkIconTheme *icon_theme;
747 GtkIconPaintable *info;
748 GFile *file;
749 GIcon *icon;
750 GError *error = NULL;
751 GdkPixbuf *pixbuf;
752 GtkSnapshot *snapshot;
753 GskRenderNode *node;
754 graphene_rect_t bounds;
755
756 char *path = g_build_filename (first_element: g_test_get_dir (file_type: G_TEST_DIST),
757 "icons",
758 "scalable",
759 "nonsquare-symbolic.svg",
760 NULL);
761
762 /* load the original image for reference */
763 pixbuf = gdk_pixbuf_new_from_file (filename: path, error: &error);
764
765 g_assert_no_error (error);
766 g_assert_nonnull (pixbuf);
767
768 width = gdk_pixbuf_get_width (pixbuf);
769 height = gdk_pixbuf_get_height (pixbuf);
770 size = MAX (width, height);
771 g_object_unref (object: pixbuf);
772
773 g_assert_cmpint (width, !=, height);
774
775 /* now load it through GtkIconTheme */
776 icon_theme = gtk_icon_theme_get_for_display (display: gdk_display_get_default ());
777 file = g_file_new_for_path (path);
778 icon = g_file_icon_new (file);
779 info = gtk_icon_theme_lookup_by_gicon (self: icon_theme, icon,
780 size: height, scale: 1, direction: GTK_TEXT_DIR_NONE, flags: 0);
781 g_assert_nonnull (info);
782
783 snapshot = gtk_snapshot_new ();
784 gdk_paintable_snapshot (paintable: GDK_PAINTABLE (ptr: info), snapshot, width: size, height: size);
785 node = gtk_snapshot_free_to_node (snapshot);
786
787 /* the original dimensions have been preserved */
788
789 gsk_render_node_get_bounds (node, bounds: &bounds);
790 g_assert_cmpint (bounds.size.width, ==, width);
791 g_assert_cmpint (bounds.size.height, ==, height);
792
793 gsk_render_node_unref (node);
794 g_free (mem: path);
795 g_object_unref (object: file);
796 g_object_unref (object: icon);
797 g_object_unref (object: info);
798}
799
800static void
801require_env (const char *var)
802{
803 if (g_getenv (variable: var) == NULL)
804 g_warning ("Some tests require %s to be set", var);
805}
806
807int
808main (int argc, char *argv[])
809{
810 require_env (var: "G_TEST_SRCDIR");
811
812 gtk_test_init (argcp: &argc, argvp: &argv);
813
814 g_test_add_func (testpath: "/icontheme/basics", test_func: test_basics);
815 g_test_add_func (testpath: "/icontheme/generic-fallback", test_func: test_generic_fallback);
816 g_test_add_func (testpath: "/icontheme/force-symbolic", test_func: test_force_symbolic);
817 g_test_add_func (testpath: "/icontheme/force-regular", test_func: test_force_regular);
818 g_test_add_func (testpath: "/icontheme/rtl", test_func: test_rtl);
819 g_test_add_func (testpath: "/icontheme/symbolic-single-size", test_func: test_symbolic_single_size);
820 g_test_add_func (testpath: "/icontheme/svg-size", test_func: test_svg_size);
821 g_test_add_func (testpath: "/icontheme/size", test_func: test_size);
822 g_test_add_func (testpath: "/icontheme/list", test_func: test_list);
823 g_test_add_func (testpath: "/icontheme/inherit", test_func: test_inherit);
824 g_test_add_func (testpath: "/icontheme/nonsquare-symbolic", test_func: test_nonsquare_symbolic);
825 g_test_add_func (testpath: "/icontheme/lookup-order", test_func: test_lookup_order);
826
827 return g_test_run();
828}
829

source code of gtk/testsuite/gtk/icontheme.c