diff options
author | Ran Benita <ran234@gmail.com> | 2012-05-19 02:35:15 +0300 |
---|---|---|
committer | Ran Benita <ran234@gmail.com> | 2012-05-20 20:31:49 +0300 |
commit | 869c6871906526bcef2c835e2072a1a71ad03c33 (patch) | |
tree | e3b73218e1d4a01f6023390dd9cab408fef195ce /test/rules-file.c | |
parent | 68edd5f0df85c0bce5368c9c7aa52be219e50011 (diff) |
rules: add test
Add a non-extensive test to check that some basic things (e.g. rule
matching, var substitution, indexes and groups) work as expected.
Signed-off-by: Ran Benita <ran234@gmail.com>
Diffstat (limited to 'test/rules-file.c')
-rw-r--r-- | test/rules-file.c | 184 |
1 files changed, 184 insertions, 0 deletions
diff --git a/test/rules-file.c b/test/rules-file.c new file mode 100644 index 0000000..90981a2 --- /dev/null +++ b/test/rules-file.c @@ -0,0 +1,184 @@ +/* + * Copyright © 2012 Ran Benita <ran234@gmail.com> + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include <assert.h> +#include <stdbool.h> +#include <stdio.h> +#include <string.h> + +#include "xkbcommon/xkbcommon.h" +#include "rules.h" + +struct test_data { + /* Rules file */ + const char *rules; + + /* Input */ + const char *model; + const char *layout; + const char *variant; + const char *options; + + /* Expected output */ + const char *keymap; + const char *keycodes; + const char *types; + const char *compat; + const char *symbols; + + /* Or set this if xkb_components_from_rules() should fail. */ + bool should_fail; +}; + +static inline bool +streq(const char *s1, const char *s2) +{ + if (s1 == NULL || s2 == NULL) + return s1 == s2; + return strcmp(s1, s2) == 0; +} + +static bool +test_rules(struct xkb_context *ctx, struct test_data *data) +{ + bool passed; + const struct xkb_rule_names rmlvo = { + data->rules, data->model, data->layout, data->variant, data->options + }; + struct xkb_component_names *kccgst; + + fprintf(stderr, "\n\nChecking : %s\t%s\t%s\t%s\t%s\n", data->rules, + data->model, data->layout, data->variant, data->options); + + if (data->should_fail) + fprintf(stderr, "Expecting: NULL\n"); + else + fprintf(stderr, "Expecting: %s\t%s\t%s\t%s\t%s\n", data->keymap, + data->keycodes, data->types, data->compat, data->symbols); + + kccgst = xkb_components_from_rules(ctx, &rmlvo); + if (!kccgst) { + fprintf(stderr, "Received: NULL\n"); + return data->should_fail; + } + + fprintf(stderr, "Received : %s\t%s\t%s\t%s\t%s\n", kccgst->keymap, + kccgst->keycodes, kccgst->types, kccgst->compat, kccgst->symbols); + + passed = streq(kccgst->keymap, data->keymap) && + streq(kccgst->keycodes, data->keycodes) && + streq(kccgst->types, data->types) && + streq(kccgst->compat, data->compat) && + streq(kccgst->symbols, data->symbols); + + free(kccgst->keymap); + free(kccgst->keycodes); + free(kccgst->types); + free(kccgst->compat); + free(kccgst->symbols); + free(kccgst); + + return passed; +} + +int +main(void) +{ + struct xkb_context *ctx; + const char *srcdir = getenv("srcdir"); + char *path; + + ctx = xkb_context_new(XKB_CONTEXT_NO_DEFAULT_INCLUDES); + assert(ctx); + + assert(asprintf(&path, "%s/test/data", srcdir ? srcdir : ".") > 0); + assert(xkb_context_include_path_append(ctx, path)); + free(path); + + struct test_data test1 = { + .rules = "simple", + + .model = "my_model", .layout = "my_layout", .variant = "my_variant", + .options = "my_option", + + .keycodes = "my_keycodes", .types = "my_types", + .compat = "my_compat+some:compat", + .symbols = "my_symbols+extra_variant", + }; + assert(test_rules(ctx, &test1)); + + struct test_data test2 = { + .rules = "simple", + + .model = "", .layout = "", .variant = "", .options = "", + + .keycodes = "default_keycodes", .types = "default_types", + .compat = "default_compat", .symbols = "default_symbols", + }; + assert(test_rules(ctx, &test2)); + + struct test_data test3 = { + .rules = "groups", + + .model = "pc104", .layout = "foo", .variant = "", .options = "", + + .keycodes = "something(pc104)", .types = "default_types", + .compat = "default_compat", .symbols = "default_symbols", + }; + assert(test_rules(ctx, &test3)); + + struct test_data test4 = { + .rules = "groups", + + .model = "foo", .layout = "ar", .variant = "bar", .options = "", + + .keycodes = "default_keycodes", .types = "default_types", + .compat = "default_compat", .symbols = "my_symbols+(bar)", + }; + assert(test_rules(ctx, &test4)); + + struct test_data test5 = { + .rules = "simple", + + .model = NULL, .layout = "my_layout,second_layout", .variant = "my_variant", + .options = "my_option", + + .should_fail = true + }; + assert(test_rules(ctx, &test5)); + + struct test_data test6 = { + .rules = "index", + + .model = "", .layout = "br,al,cn,az", .variant = "", + .options = "some:opt", + + .keycodes = "default_keycodes", .types = "default_types", + .compat = "default_compat", + .symbols = "default_symbols+extra:1+extra:2+extra:3+extra:4", + }; + assert(test_rules(ctx, &test6)); + + xkb_context_unref(ctx); + return 0; +} |