GCC Code Coverage Report


Directory: ./
File: tests/keyboard/test-keyboard-shortcuts.c
Date: 2024-05-04 07:58:27
Exec Total Coverage
Lines: 26 30 86.7%
Functions: 4 4 100.0%
Branches: 8 12 66.7%

Line Branch Exec Source
1 #include <gdk/gdk.h>
2 #include <gtk/gtk.h>
3 #include <locale.h>
4 #include <stdlib.h>
5 #include "keyboard-shortcuts.h"
6
7 #define NUM_LAYOUTS 4
8
9 typedef struct _shortcut_test {
10 guint16 keycode;
11 GdkModifierType modifiers;
12 char *expected_results[NUM_LAYOUTS];
13 } shortcut_test;
14
15 /* keycodes taken from /usr/share/X11/xkb/keycodes/evdev */
16 shortcut_test shortcut_tests[] = {
17 {
18 24 /* first key after tab in first letter row */,
19 GDK_SHIFT_MASK | GDK_SUPER_MASK,
20 {
21 "<Shift><Super>q" /* us */,
22 "<Shift><Super>apostrophe" /* us+dvorak */,
23 "<Shift><Super>a" /* fr+azerty */,
24 "<Shift><Super>Cyrillic_shorti" /* ru */
25 /* "<Shift><Super>q" would be valid, too */,
26 },
27 },
28 {
29 13 /* fifth key in num row */,
30 GDK_SUPER_MASK,
31 {
32 "<Super>4" /* us */,
33 "<Super>4" /* us+dvorak */,
34 "<Super>4" /* fr+azerty */,
35 "<Super>4" /* ru */,
36 },
37 },
38 {
39 13 /* fifth key in num row */,
40 GDK_SHIFT_MASK | GDK_SUPER_MASK,
41 {
42 "<Shift><Super>4" /* us */,
43 "<Shift><Super>4" /* us+dvorak */,
44 "<Shift><Super>4" /* fr+azerty */,
45 "<Shift><Super>4" /* ru */,
46 },
47 },
48 {
49 65 /* space key */,
50 GDK_SHIFT_MASK | GDK_SUPER_MASK,
51 {
52 "<Shift><Super>space" /* us */,
53 "<Shift><Super>space" /* us+dvorak */,
54 "<Shift><Super>space" /* fr+azerty */,
55 "<Shift><Super>space" /* ru */,
56 },
57 },
58 {
59 23 /* tab key */,
60 GDK_SHIFT_MASK | GDK_SUPER_MASK,
61 {
62 "<Shift><Super>Tab" /* us */,
63 "<Shift><Super>Tab" /* us+dvorak */,
64 "<Shift><Super>Tab" /* fr+azerty */,
65 "<Shift><Super>Tab" /* ru */,
66 },
67 },
68 {
69 107 /* print screen/sysrq key */,
70 GDK_ALT_MASK,
71 {
72 "<Alt>Print" /* us */,
73 "<Alt>Print" /* us+dvorak */,
74 "<Alt>Print" /* fr+azerty */,
75 "<Alt>Print" /* ru */,
76 },
77 },
78 };
79
80 static void
81 6 test_event_translation (shortcut_test *shortcut_test)
82 {
83 6 g_autofree char *translated_name = NULL;
84 guint keyval;
85 GdkModifierType modifiers;
86
87
2/2
✓ Branch 0 taken 24 times.
✓ Branch 1 taken 6 times.
30 for (int group = 0; group < NUM_LAYOUTS; group++)
88 {
89
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 24 times.
24 if (!shortcut_test->expected_results[group])
90 continue;
91
92 24 normalize_keyval_and_mask (shortcut_test->keycode,
93 shortcut_test->modifiers,
94 group,
95 &keyval,
96 &modifiers);
97
98 24 translated_name = gtk_accelerator_name (keyval, modifiers);
99
100
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 24 times.
24 if (g_strcmp0 (translated_name, shortcut_test->expected_results[group]) != 0)
101 {
102 g_error ("Result for keycode %u with modifieres %u for "
103 "group %d doesn't match '%s' (got: '%s')",
104 shortcut_test->keycode,
105 shortcut_test->modifiers,
106 group,
107 shortcut_test->expected_results[group],
108 translated_name);
109 g_test_fail ();
110 }
111 }
112 6 }
113
114 static void
115 1 set_keyboard_layouts (char *layouts,
116 char *variants,
117 char *options)
118 {
119 GSubprocess *proc;
120 1 GError *error = NULL;
121
122 1 proc = g_subprocess_new (G_SUBPROCESS_FLAGS_NONE,
123 &error,
124 "setxkbmap",
125 "-layout", layouts,
126 "-variant", variants,
127 "-option", options,
128 "-model", "pc105",
129 NULL);
130
131
2/4
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
1 if (!proc || !g_subprocess_wait_check(proc, NULL, &error))
132 {
133 g_critical ("Failed to set layout: %s", error->message);
134 exit (1);
135 }
136
137 1 g_object_unref (proc);
138 1 }
139
140 static void
141 1 run_shortcut_tests (void)
142 {
143 1 set_keyboard_layouts ("us,us,fr,ru", ",dvorak,azerty,", "");
144
145
2/2
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 1 times.
7 for (int i = 0; i < G_N_ELEMENTS(shortcut_tests); i++)
146 6 test_event_translation (&shortcut_tests[i]);
147 1 }
148
149 1 int main (int argc, char **argv)
150 {
151 1 g_setenv ("GSETTINGS_BACKEND", "memory", TRUE);
152 1 g_setenv ("GDK_BACKEND", "x11", TRUE);
153 1 g_setenv ("LC_ALL", "C", TRUE);
154
155 1 gtk_test_init (&argc, &argv, NULL);
156
157 1 g_test_add_func ("/keyboard/shortcut-translation",
158 run_shortcut_tests);
159
160 1 return g_test_run ();
161 }
162