| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570 |
- /*
- * Copyright © 2009 Dan Nicholson
- * SPDX-License-Identifier: MIT
- */
- #include "config.h"
- #include "features/enums.h"
- #include "test-config.h"
- #include <assert.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include "xkbcommon/xkbcommon.h"
- #include "test.h"
- #include "utils.h"
- #define GOLDEN_TESTS_OUTPUTS "keymaps/"
- struct keymap_test_data {
- /** Keymap string to compile */
- const char * const keymap;
- /** Resulting file *path* to reference serialization,
- * or NULL if the keymap string should not compile. */
- const char * const expected;
- /** Optionally skip the test */
- bool skip;
- };
- static const struct {
- const char* name;
- enum xkb_keymap_compile_flags flags;
- bool fail;
- } modes[] = {
- {
- "strict",
- (TEST_KEYMAP_COMPILE_FLAGS | XKB_KEYMAP_COMPILE_STRICT_MODE),
- true
- },
- {
- "lax",
- (TEST_KEYMAP_COMPILE_FLAGS & ~XKB_KEYMAP_COMPILE_STRICT_MODE),
- false
- },
- };
- /* Our keymap compiler is the xkbcommon buffer compiler */
- static struct xkb_keymap *
- compile_buffer(struct xkb_context *context, enum xkb_keymap_format format,
- const char *buf, size_t len, void *private)
- {
- return test_compile_buffer2(context, format,
- *(enum xkb_keymap_compile_flags*)private,
- buf, len);
- }
- static void
- test_unknown_declaration_statements(struct xkb_context *ctx, bool update_files)
- {
- static const struct keymap_test_data tests[] = {
- /*
- * Keycodes
- */
- {
- .keymap = "default xkb_keymap { xkb_keycodes { xxx \"1\" = \"xxx\"; }; };",
- .expected = GOLDEN_TESTS_OUTPUTS "optional-components-none.xkb"
- },
- {
- .keymap = "default xkb_keymap { xkb_keycodes { xxx 1 = yyy; }; };",
- .expected = GOLDEN_TESTS_OUTPUTS "optional-components-none.xkb"
- },
- {
- .keymap = "default xkb_keymap { xkb_keycodes { xxx 1.23 = Group1; }; };",
- .expected = GOLDEN_TESTS_OUTPUTS "optional-components-none.xkb"
- },
- {
- .keymap = "default xkb_keymap { xkb_keycodes { xxx <> = 1 + 1; }; };",
- .expected = GOLDEN_TESTS_OUTPUTS "optional-components-none.xkb"
- },
- /*
- * Types
- */
- {
- .keymap = "default xkb_keymap { xkb_types { xxx \"1\" = \"xxx\"; }; };",
- .expected = GOLDEN_TESTS_OUTPUTS "optional-components-none.xkb"
- },
- {
- .keymap = "default xkb_keymap { xkb_types { xxx 1 = yyy; }; };",
- .expected = GOLDEN_TESTS_OUTPUTS "optional-components-none.xkb"
- },
- {
- .keymap = "default xkb_keymap { xkb_types { xxx 1.23 = Group1; }; };",
- .expected = GOLDEN_TESTS_OUTPUTS "optional-components-none.xkb"
- },
- {
- .keymap = "default xkb_keymap { xkb_types { xxx <> = 1 + 1; }; };",
- .expected = GOLDEN_TESTS_OUTPUTS "optional-components-none.xkb"
- },
- /*
- * Compat
- */
- {
- .keymap = "default xkb_keymap { xkb_compat { xxx \"1\" = \"xxx\"; }; };",
- .expected = GOLDEN_TESTS_OUTPUTS "optional-components-none.xkb"
- },
- {
- .keymap = "default xkb_keymap { xkb_compat { xxx 1 = yyy; }; };",
- .expected = GOLDEN_TESTS_OUTPUTS "optional-components-none.xkb"
- },
- {
- .keymap = "default xkb_keymap { xkb_compat { xxx 1.23 = Group1; }; };",
- .expected = GOLDEN_TESTS_OUTPUTS "optional-components-none.xkb"
- },
- {
- .keymap = "default xkb_keymap { xkb_compat { xxx <> = 1 + 1; }; };",
- .expected = GOLDEN_TESTS_OUTPUTS "optional-components-none.xkb"
- },
- /*
- * Symbols
- */
- {
- .keymap = "default xkb_keymap { xkb_symbols { xxx \"1\" = \"xxx\"; }; };",
- .expected = GOLDEN_TESTS_OUTPUTS "optional-components-none.xkb"
- },
- {
- .keymap = "default xkb_keymap { xkb_symbols { xxx 1 = yyy; }; };",
- .expected = GOLDEN_TESTS_OUTPUTS "optional-components-none.xkb"
- },
- {
- .keymap = "default xkb_keymap { xkb_symbols { xxx 1.23 = Group1; }; };",
- .expected = GOLDEN_TESTS_OUTPUTS "optional-components-none.xkb"
- },
- {
- .keymap = "default xkb_keymap { xkb_symbols { xxx <> = 1 + 1; }; };",
- .expected = GOLDEN_TESTS_OUTPUTS "optional-components-none.xkb"
- },
- };
- for (unsigned int k = 0; k < ARRAY_SIZE(tests); k++) {
- fprintf(stderr, "------\n*** %s: #%u ***\n", __func__, k);
- for (size_t m = 0; m < ARRAY_SIZE(modes); m++) {
- assert(test_compile_output(
- ctx, XKB_KEYMAP_FORMAT_TEXT_V2, XKB_KEYMAP_USE_ORIGINAL_FORMAT,
- compile_buffer, (void*)&modes[m].flags, modes[m].name,
- tests[k].keymap, strlen(tests[k].keymap),
- (modes[m].fail ? NULL : tests[k].expected), update_files
- ));
- }
- }
- }
- static void
- test_unknown_compound_statements(struct xkb_context *ctx, bool update_files)
- {
- static const struct keymap_test_data tests[] = {
- /*
- * Keycodes
- */
- {
- .keymap = "default xkb_keymap { xkb_keycodes { xxx {}; }; };",
- .expected = GOLDEN_TESTS_OUTPUTS "optional-components-none.xkb"
- },
- {
- .keymap = "default xkb_keymap { xkb_keycodes { xxx \"yyy\" {}; }; };",
- .expected = GOLDEN_TESTS_OUTPUTS "optional-components-none.xkb"
- },
- {
- .keymap = "default xkb_keymap { xkb_keycodes { xxx.yyy = 0; }; };",
- .expected = GOLDEN_TESTS_OUTPUTS "optional-components-none.xkb"
- },
- /*
- * Types
- */
- {
- .keymap = "default xkb_keymap { xkb_types { xxx { yyy = 1; }; }; };",
- .expected = GOLDEN_TESTS_OUTPUTS "optional-components-none.xkb"
- },
- {
- .keymap = "default xkb_keymap { xkb_types { xxx 1 { yyy[1] = true; }; }; };",
- .expected = GOLDEN_TESTS_OUTPUTS "optional-components-none.xkb"
- },
- {
- .keymap = "default xkb_keymap { xkb_types { xxx.yyy = 0; }; };",
- .expected = GOLDEN_TESTS_OUTPUTS "optional-components-none.xkb"
- },
- /*
- * Compat
- */
- {
- .keymap = "default xkb_keymap { xkb_compat { xxx 1.23 {}; }; };",
- .expected = GOLDEN_TESTS_OUTPUTS "optional-components-none.xkb"
- },
- {
- .keymap = "default xkb_keymap { xkb_compat { xxx.yyy = 0; }; };",
- .expected = GOLDEN_TESTS_OUTPUTS "optional-components-none.xkb"
- },
- /*
- * Symbols
- */
- {
- .keymap = "default xkb_keymap { xkb_symbols { xxx <> { a[<>] = {}; }; }; };",
- .expected = GOLDEN_TESTS_OUTPUTS "optional-components-none.xkb"
- },
- {
- .keymap = "default xkb_keymap { xkb_symbols { xxx.yyy = 0; }; };",
- .expected = GOLDEN_TESTS_OUTPUTS "optional-components-none.xkb"
- },
- };
- for (unsigned int k = 0; k < ARRAY_SIZE(tests); k++) {
- fprintf(stderr, "------\n*** %s: #%u ***\n", __func__, k);
- for (size_t m = 0; m < ARRAY_SIZE(modes); m++) {
- assert(test_compile_output(
- ctx, XKB_KEYMAP_FORMAT_TEXT_V2, XKB_KEYMAP_USE_ORIGINAL_FORMAT,
- compile_buffer, (void*)&modes[m].flags, modes[m].name,
- tests[k].keymap, strlen(tests[k].keymap),
- (modes[m].fail ? NULL : tests[k].expected), update_files
- ));
- }
- }
- }
- static void
- test_unknown_fields(struct xkb_context *ctx, bool update_files)
- {
- static const struct keymap_test_data tests[] = {
- /*
- * Keycodes
- */
- {
- .keymap = "default xkb_keymap { xkb_keycodes { xxx = 0; }; };",
- .expected = GOLDEN_TESTS_OUTPUTS "optional-components-none.xkb"
- },
- /*
- * Types
- */
- {
- .keymap = "default xkb_keymap { xkb_types { xxx = 0; }; };",
- .expected = GOLDEN_TESTS_OUTPUTS "optional-components-none.xkb"
- },
- {
- .keymap = "default xkb_keymap { xkb_types { type \"1\" { xxx = 0; }; }; };",
- .expected = GOLDEN_TESTS_OUTPUTS "lax-types-unknown-type-field.xkb"
- },
- /*
- * Compat
- */
- {
- .keymap = "default xkb_keymap { xkb_compat { xxx = 0; }; };",
- .expected = GOLDEN_TESTS_OUTPUTS "optional-components-none.xkb"
- },
- {
- .keymap = "default xkb_keymap { xkb_compat { interpret A { xxx = 0; }; }; };",
- .expected = GOLDEN_TESTS_OUTPUTS "lax-compat-unknown-interpret-field.xkb"
- },
- {
- .keymap = "default xkb_keymap { xkb_compat { indicator \"1\" { xxx = 0; }; }; };",
- .expected = GOLDEN_TESTS_OUTPUTS "lax-compat-unknown-indicator-field.xkb"
- },
- /*
- * Symbols
- */
- {
- .keymap = "default xkb_keymap { xkb_symbols { xxx = 0; }; };",
- .expected = GOLDEN_TESTS_OUTPUTS "optional-components-none.xkb"
- },
- {
- .keymap =
- "default xkb_keymap {\n"
- " xkb_keycodes { <> = 1; };\n"
- " xkb_symbols { key <> { xxx = 0, [none], [NoAction()] }; };\n"
- "};",
- .expected = GOLDEN_TESTS_OUTPUTS "lax-symbols-unknown-key-field.xkb"
- },
- };
- for (unsigned int k = 0; k < ARRAY_SIZE(tests); k++) {
- fprintf(stderr, "------\n*** %s: #%u ***\n", __func__, k);
- for (size_t m = 0; m < ARRAY_SIZE(modes); m++) {
- assert(test_compile_output(
- ctx, XKB_KEYMAP_FORMAT_TEXT_V2, XKB_KEYMAP_USE_ORIGINAL_FORMAT,
- compile_buffer, (void*)&modes[m].flags, modes[m].name,
- tests[k].keymap, strlen(tests[k].keymap),
- (modes[m].fail ? NULL : tests[k].expected), update_files
- ));
- }
- }
- }
- static void
- test_unknown_values(struct xkb_context *ctx, bool update_files)
- {
- static const struct keymap_test_data tests[] = {
- /*
- * Keycodes
- */
- {
- .keymap =
- "default xkb_keymap {\n"
- " xkb_keycodes {\n"
- " minimum = xxx;\n"
- " maximum = \"x\";\n"
- " maximum[0] = 1;\n"
- " };\n"
- "};",
- .expected = GOLDEN_TESTS_OUTPUTS "optional-components-none.xkb"
- },
- /*
- * Types
- */
- // TODO: types fields
- // {
- // .keymap =
- // "default xkb_keymap {\n"
- // " xkb_types {};\n"
- // "};",
- // .expected = GOLDEN_TESTS_OUTPUTS "optional-components-none.xkb"
- // },
- /*
- * Compat
- */
- // TODO: interpret & LEDs fields
- // {
- // .keymap =
- // "default xkb_keymap {\n"
- // " xkb_compat {\n"
- // " interpret. = \"\";\n"
- // " };\n"
- // "};",
- // .expected = GOLDEN_TESTS_OUTPUTS "optional-components-none.xkb"
- // },
- /*
- * Symbols
- */
- // {
- // .keymap =
- // "default xkb_keymap {\n"
- // " xkb_symbols {};\n"
- // "};",
- // .expected = GOLDEN_TESTS_OUTPUTS "optional-components-none.xkb"
- // },
- };
- for (unsigned int k = 0; k < ARRAY_SIZE(tests); k++) {
- fprintf(stderr, "------\n*** %s: #%u ***\n", __func__, k);
- for (size_t m = 0; m < ARRAY_SIZE(modes); m++) {
- assert(test_compile_output(
- ctx, XKB_KEYMAP_FORMAT_TEXT_V2, XKB_KEYMAP_USE_ORIGINAL_FORMAT,
- compile_buffer, (void*)&modes[m].flags, modes[m].name,
- tests[k].keymap, strlen(tests[k].keymap),
- (modes[m].fail ? NULL : tests[k].expected), update_files
- ));
- }
- }
- }
- static void
- test_actions(struct xkb_context *ctx, bool update_files)
- {
- static const struct keymap_test_data tests[] = {
- /*
- * Compat
- */
- {
- .keymap = "default xkb_keymap { xkb_compat { SetMods.xxx = 0; }; };",
- .expected = GOLDEN_TESTS_OUTPUTS "optional-components-none.xkb"
- },
- {
- .keymap = "default xkb_keymap { xkb_compat { SetMods.mods = xxx; }; };",
- .expected = GOLDEN_TESTS_OUTPUTS "optional-components-none.xkb"
- },
- {
- .keymap = "default xkb_keymap { xkb_compat { SetMods.mods = \"0\"; }; };",
- .expected = GOLDEN_TESTS_OUTPUTS "optional-components-none.xkb"
- },
- {
- .keymap = "default xkb_keymap { xkb_compat { SetMods.mods[0] = 0; }; };",
- .expected = GOLDEN_TESTS_OUTPUTS "optional-components-none.xkb"
- },
- {
- .keymap = "default xkb_keymap { xkb_compat { XXX.xxx = 0; }; };",
- .expected = GOLDEN_TESTS_OUTPUTS "optional-components-none.xkb"
- },
- {
- .keymap =
- "default xkb_keymap {\n"
- " xkb_compat { interpret A { action = XXX(); }; };\n"
- "};",
- .expected = GOLDEN_TESTS_OUTPUTS "lax-compat-unknown-interpret-field.xkb"
- },
- {
- .keymap =
- "default xkb_keymap {\n"
- " xkb_compat { interpret A { action = XXX(xxx=0); }; };\n"
- "};",
- .expected = GOLDEN_TESTS_OUTPUTS "lax-compat-unknown-interpret-field.xkb"
- },
- {
- .keymap =
- "default xkb_keymap {\n"
- " xkb_compat { interpret A { action = SetMods(xxx=0); }; };\n"
- "};",
- .expected = GOLDEN_TESTS_OUTPUTS "lax-compat-unknown-action-field.xkb"
- },
- {
- .keymap =
- "default xkb_keymap {\n"
- " xkb_compat { interpret A { action = SetMods(mods=xxx); }; };\n"
- "};",
- .expected = GOLDEN_TESTS_OUTPUTS "lax-compat-unknown-action-value.xkb"
- },
- {
- .keymap =
- "default xkb_keymap {\n"
- " xkb_compat { interpret A { action = SetMods(mods=\"0\"); }; };\n"
- "};",
- .expected = GOLDEN_TESTS_OUTPUTS "lax-compat-unknown-action-value.xkb"
- },
- {
- .keymap =
- "default xkb_keymap {\n"
- " xkb_compat { interpret A { action = SetMods(mods[0]=0); }; };\n"
- "};",
- .expected = GOLDEN_TESTS_OUTPUTS "lax-compat-unknown-action-value.xkb"
- },
- /*
- * Symbols
- */
- {
- .keymap = "default xkb_keymap { xkb_symbols { SetMods.xxx = 0; }; };",
- .expected = GOLDEN_TESTS_OUTPUTS "optional-components-none.xkb"
- },
- {
- .keymap = "default xkb_keymap { xkb_symbols { SetMods.mods = xxx; }; };",
- .expected = GOLDEN_TESTS_OUTPUTS "optional-components-none.xkb"
- },
- {
- .keymap = "default xkb_keymap { xkb_symbols { SetMods.mods = \"0\"; }; };",
- .expected = GOLDEN_TESTS_OUTPUTS "optional-components-none.xkb"
- },
- {
- .keymap = "default xkb_keymap { xkb_symbols { SetMods.mods[0] = 0; }; };",
- .expected = GOLDEN_TESTS_OUTPUTS "optional-components-none.xkb"
- },
- {
- .keymap = "default xkb_keymap { xkb_symbols { XXX.xxx = 0; }; };",
- .expected = GOLDEN_TESTS_OUTPUTS "optional-components-none.xkb"
- },
- {
- .keymap =
- "default xkb_keymap {\n"
- " xkb_keycodes { <> = 1; };\n"
- " xkb_symbols { key <> { [none], [XXX()] }; };\n"
- "};",
- .expected = GOLDEN_TESTS_OUTPUTS "lax-symbols-unknown-key-field.xkb"
- },
- {
- .keymap =
- "default xkb_keymap {\n"
- " xkb_keycodes { <> = 1; };\n"
- " xkb_symbols { key <> { [none], [XXX(xxx=0)] }; };\n"
- "};",
- .expected = GOLDEN_TESTS_OUTPUTS "lax-symbols-unknown-key-field.xkb"
- },
- {
- .keymap =
- "default xkb_keymap {\n"
- " xkb_keycodes { <> = 1; };\n"
- " xkb_symbols { key <> { [none], [SetMods(xxx=0)] }; };\n"
- "};",
- .expected = GOLDEN_TESTS_OUTPUTS "lax-symbols-unknown-action-field.xkb"
- },
- {
- .keymap =
- "default xkb_keymap {\n"
- " xkb_keycodes { <> = 1; };\n"
- " xkb_symbols { key <> { [none], [SetMods(mods=xxx)] }; };\n"
- "};",
- .expected = GOLDEN_TESTS_OUTPUTS "lax-symbols-unknown-action-value.xkb"
- },
- {
- .keymap =
- "default xkb_keymap {\n"
- " xkb_keycodes { <> = 1; };\n"
- " xkb_symbols { key <> { [none], [SetMods(mods=\"0\")] }; };\n"
- "};",
- .expected = GOLDEN_TESTS_OUTPUTS "lax-symbols-unknown-action-value.xkb"
- },
- {
- .keymap =
- "default xkb_keymap {\n"
- " xkb_keycodes { <> = 1; };\n"
- " xkb_symbols { key <> { [none], [SetMods(mods[0]=0)] }; };\n"
- "};",
- .expected = GOLDEN_TESTS_OUTPUTS "lax-symbols-unknown-action-value.xkb"
- },
- };
- for (unsigned int k = 0; k < ARRAY_SIZE(tests); k++) {
- fprintf(stderr, "------\n*** %s: #%u ***\n", __func__, k);
- for (size_t m = 0; m < ARRAY_SIZE(modes); m++) {
- assert(test_compile_output(
- ctx, XKB_KEYMAP_FORMAT_TEXT_V2, XKB_KEYMAP_USE_ORIGINAL_FORMAT,
- compile_buffer, (void*)&modes[m].flags, modes[m].name,
- tests[k].keymap, strlen(tests[k].keymap),
- (modes[m].fail ? NULL : tests[k].expected), update_files
- ));
- }
- }
- }
- int
- main(int argc, char *argv[])
- {
- test_init();
- bool update_output_files = false;
- if (argc > 1) {
- if (streq(argv[1], "update")) {
- /* Update files with *obtained* results */
- update_output_files = true;
- } else {
- fprintf(stderr, "ERROR: unsupported argument: \"%s\".\n", argv[1]);
- exit(EXIT_FAILURE);
- }
- }
- struct xkb_context *ctx = test_get_context(CONTEXT_NO_FLAG);
- test_unknown_declaration_statements(ctx, update_output_files);
- test_unknown_compound_statements(ctx, update_output_files);
- test_unknown_fields(ctx, update_output_files);
- test_unknown_values(ctx, update_output_files);
- test_actions(ctx, update_output_files);
- xkb_context_unref(ctx);
- return EXIT_SUCCESS;
- }
|