Skip to content

Commit 6adac2d

Browse files
committed
add tests
1 parent aab6425 commit 6adac2d

File tree

5 files changed

+123
-1
lines changed

5 files changed

+123
-1
lines changed

test/common.c

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -429,3 +429,33 @@ test_compile_rules(struct xkb_context *context, const char *rules,
429429

430430
return keymap;
431431
}
432+
433+
struct xkb_keymap *
434+
test_compile_rules_with_flags(struct xkb_context *context, const char *rules,
435+
const char *model, const char *layout,
436+
const char *variant, const char *options,
437+
enum xkb_keymap_compile_flags flags)
438+
{
439+
struct xkb_keymap *keymap;
440+
struct xkb_rule_names rmlvo = {
441+
.rules = isempty(rules) ? NULL : rules,
442+
.model = isempty(model) ? NULL : model,
443+
.layout = isempty(layout) ? NULL : layout,
444+
.variant = isempty(variant) ? NULL : variant,
445+
.options = isempty(options) ? NULL : options
446+
};
447+
448+
if (!rules && !model && !layout && !variant && !options)
449+
keymap = xkb_keymap_new_from_names(context, NULL, flags);
450+
else
451+
keymap = xkb_keymap_new_from_names(context, &rmlvo, flags);
452+
453+
if (!keymap) {
454+
fprintf(stderr,
455+
"Failed to compile RMLVO: '%s', '%s', '%s', '%s', '%s'\n",
456+
rules, model, layout, variant, options);
457+
return NULL;
458+
}
459+
460+
return keymap;
461+
}

test/data/symbols/awesome

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,14 @@ xkb_symbols "awesome" {
1919
key <AC01> { [ a, A, Return, Return ] };
2020
key <AC02> { [ s, S, Left] };
2121
key <AC03> { [ d, D, Down] };
22-
key <AC04> { [ f, F, Righ] };
22+
key <AC04> { [ f, F, Right] };
2323
key <AC05> { [ g, G, BackSpace, BackSpace ] };
2424

2525
key <AB05> { [ b, B, Delete, Delete ] };
26+
27+
key <LCTL> {
28+
groupsRedirect=0,
29+
symbols[1] = [ {Control_L, ISO_First_Group } ],
30+
actions[1] = [ {SetMods(modifiers=Control), SetGroup(group=-4) } ]
31+
};
2632
};

test/keymap.c

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
#include <stdio.h>
3030
#include <stdlib.h>
3131

32+
#include "evdev-scancodes.h"
3233
#include "test.h"
3334
#include "keymap.h"
3435

@@ -230,6 +231,80 @@ test_multiple_keysyms_per_level(void)
230231
xkb_context_unref(context);
231232
}
232233

234+
static void
235+
test_multiple_actions_per_level(void)
236+
{
237+
struct xkb_context *context = test_get_context(0);
238+
struct xkb_keymap *keymap;
239+
xkb_keycode_t kc;
240+
int keysyms_count;
241+
const xkb_layout_index_t first_layout = 0;
242+
const xkb_keysym_t *keysyms;
243+
xkb_mod_index_t ctrl;
244+
xkb_layout_index_t layout;
245+
xkb_mod_mask_t base_mods;
246+
247+
assert(context);
248+
249+
keymap = test_compile_rules_with_flags(
250+
context, "evdev", "pc104", "awesome,cz", NULL, "grp:menu_toggle",
251+
XKB_KEYMAP_COMPILE_RANGE_REDIRECT_TO_0);
252+
assert(keymap);
253+
254+
ctrl = xkb_keymap_mod_get_index(keymap, XKB_MOD_NAME_CTRL);
255+
256+
kc = xkb_keymap_key_by_name(keymap, "LCTL");
257+
keysyms_count = xkb_keymap_key_get_syms_by_level(keymap, kc, first_layout, 0, &keysyms);
258+
assert(keysyms_count == 2);
259+
assert(keysyms[0] == XKB_KEY_Control_L);
260+
assert(keysyms[1] == XKB_KEY_ISO_First_Group);
261+
262+
struct xkb_state *state = xkb_state_new(keymap);
263+
assert(state);
264+
layout = xkb_state_key_get_layout(state, KEY_LEFTCTRL + EVDEV_OFFSET);
265+
assert(layout == 0);
266+
xkb_state_update_key(state, KEY_LEFTCTRL + EVDEV_OFFSET, XKB_KEY_DOWN);
267+
base_mods = xkb_state_serialize_mods(state, XKB_STATE_MODS_DEPRESSED);
268+
assert(base_mods == (1U << ctrl));
269+
layout = xkb_state_key_get_layout(state, XKB_KEY_2 + EVDEV_OFFSET);
270+
assert(layout == 0);
271+
xkb_state_update_key(state, KEY_LEFTCTRL + EVDEV_OFFSET, XKB_KEY_UP);
272+
base_mods = xkb_state_serialize_mods(state, XKB_STATE_MODS_DEPRESSED);
273+
assert(base_mods == 0);
274+
layout = xkb_state_key_get_layout(state, XKB_KEY_2 + EVDEV_OFFSET);
275+
assert(layout == 0);
276+
xkb_state_update_key(state, KEY_COMPOSE + EVDEV_OFFSET, XKB_KEY_DOWN);
277+
xkb_state_update_key(state, KEY_COMPOSE + EVDEV_OFFSET, XKB_KEY_UP);
278+
layout = xkb_state_key_get_layout(state, XKB_KEY_2 + EVDEV_OFFSET);
279+
assert(layout == 1);
280+
xkb_state_update_key(state, KEY_LEFTCTRL + EVDEV_OFFSET, XKB_KEY_DOWN);
281+
base_mods = xkb_state_serialize_mods(state, XKB_STATE_MODS_DEPRESSED);
282+
assert(base_mods == (1U << ctrl));
283+
layout = xkb_state_key_get_layout(state, XKB_KEY_2 + EVDEV_OFFSET);
284+
assert(layout == 0);
285+
xkb_state_update_key(state, KEY_LEFTCTRL + EVDEV_OFFSET, XKB_KEY_UP);
286+
base_mods = xkb_state_serialize_mods(state, XKB_STATE_MODS_DEPRESSED);
287+
assert(base_mods == 0);
288+
layout = xkb_state_key_get_layout(state, XKB_KEY_2 + EVDEV_OFFSET);
289+
assert(layout == 1);
290+
xkb_state_unref(state);
291+
292+
assert(test_key_seq(keymap,
293+
KEY_2, BOTH, XKB_KEY_2, NEXT,
294+
KEY_LEFTCTRL, DOWN, XKB_KEY_Control_L, XKB_KEY_ISO_First_Group, NEXT,
295+
KEY_2, BOTH, XKB_KEY_2, NEXT,
296+
KEY_LEFTCTRL, UP, XKB_KEY_Control_L, XKB_KEY_ISO_First_Group, NEXT,
297+
KEY_COMPOSE, BOTH, XKB_KEY_ISO_Next_Group, NEXT,
298+
KEY_2, BOTH, XKB_KEY_ecaron, NEXT,
299+
KEY_LEFTCTRL, DOWN, XKB_KEY_Control_L, XKB_KEY_ISO_First_Group, NEXT,
300+
KEY_2, BOTH, XKB_KEY_2, NEXT,
301+
KEY_LEFTCTRL, UP, XKB_KEY_Control_L, XKB_KEY_ISO_First_Group, NEXT,
302+
KEY_2, BOTH, XKB_KEY_ecaron, FINISH));
303+
304+
xkb_keymap_unref(keymap);
305+
xkb_context_unref(context);
306+
}
307+
233308
int
234309
main(void)
235310
{
@@ -239,6 +314,7 @@ main(void)
239314
test_keymap();
240315
test_numeric_keysyms();
241316
test_multiple_keysyms_per_level();
317+
test_multiple_actions_per_level();
242318

243319
return 0;
244320
}

test/stringcomp.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,11 @@ main(int argc, char *argv[])
8888
/* Now test that the dump of the dump is equal to the dump! */
8989
dump2 = xkb_keymap_get_as_string(keymap, XKB_KEYMAP_USE_ORIGINAL_FORMAT);
9090
assert(dump2);
91+
/* FIXME remove debug */
92+
if (!streq(dump, dump2)) {
93+
fprintf(stderr, "*** dump (%lu) ***\n%s\n", strlen(dump), dump);
94+
fprintf(stderr, "*** dump2 (%lu) ***\n%s\n", strlen(dump2), dump2);
95+
}
9196
assert(streq(dump, dump2));
9297

9398
/* Test response to invalid formats and flags. */

test/test.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,11 @@ test_compile_rules(struct xkb_context *context, const char *rules,
102102
const char *model, const char *layout, const char *variant,
103103
const char *options);
104104

105+
struct xkb_keymap *
106+
test_compile_rules_with_flags(struct xkb_context *context, const char *rules,
107+
const char *model, const char *layout,
108+
const char *variant, const char *options,
109+
enum xkb_keymap_compile_flags flags);
105110

106111
#ifdef _WIN32
107112
#define setenv(varname, value, overwrite) _putenv_s((varname), (value))

0 commit comments

Comments
 (0)