diff options
Diffstat (limited to '')
-rw-r--r-- | test/test-draglock.c | 542 |
1 files changed, 542 insertions, 0 deletions
diff --git a/test/test-draglock.c b/test/test-draglock.c new file mode 100644 index 0000000..9561303 --- /dev/null +++ b/test/test-draglock.c @@ -0,0 +1,542 @@ +/* + * SPDX-License-Identifier: MIT + * + * Copyright © 2013-2015 Red Hat, Inc. + * + * 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 "draglock.h" + +#include <assert.h> +#include <string.h> + +static void +test_config_empty(void) +{ + struct draglock dl; + int rc; + + rc = draglock_init_from_string(&dl, NULL); + assert(dl.mode == DRAGLOCK_DISABLED); + assert(rc == 0); +} + +static void +test_config_invalid(void) +{ + struct draglock dl; + int rc; + + /* no trailing space */ + rc = draglock_init_from_string(&dl, "1 "); + assert(rc != 0); + assert(dl.mode == DRAGLOCK_DISABLED); + + rc = draglock_init_from_string(&dl, "256"); + assert(rc != 0); + assert(dl.mode == DRAGLOCK_DISABLED); + + rc = draglock_init_from_string(&dl, "-1"); + assert(rc != 0); + assert(dl.mode == DRAGLOCK_DISABLED); + + rc = draglock_init_from_string(&dl, "1 2 3"); + assert(rc != 0); + assert(dl.mode == DRAGLOCK_DISABLED); + + rc = draglock_init_from_string(&dl, "0 2"); + assert(rc != 0); + assert(dl.mode == DRAGLOCK_DISABLED); + + rc = draglock_init_from_string(&dl, "0 0"); + assert(rc != 0); + assert(dl.mode == DRAGLOCK_DISABLED); +} + +static void +test_config_disable(void) +{ + struct draglock dl; + int rc; + + rc = draglock_init_from_string(&dl, ""); + assert(rc == 0); + assert(dl.mode == DRAGLOCK_DISABLED); + + rc = draglock_init_from_string(&dl, "0"); + assert(rc == 0); + assert(dl.mode == DRAGLOCK_DISABLED); +} + +static void +test_config_meta_button(void) +{ + struct draglock dl; + int rc; + + rc = draglock_init_from_string(&dl, "1"); + assert(rc == 0); + assert(dl.mode == DRAGLOCK_META); + assert(dl.meta_button == 1); + + rc = draglock_init_from_string(&dl, "2"); + assert(rc == 0); + assert(dl.mode == DRAGLOCK_META); + assert(dl.meta_button == 2); + + rc = draglock_init_from_string(&dl, "10"); + assert(rc == 0); + assert(dl.mode == DRAGLOCK_META); + assert(dl.meta_button == 10); +} + +static void +test_config_button_pairs(void) +{ + struct draglock dl; + int rc; + + rc = draglock_init_from_string(&dl, "1 1"); + assert(rc == 0); + assert(dl.mode == DRAGLOCK_PAIRS); + + rc = draglock_init_from_string(&dl, "1 2 3 4 5 6 7 8"); + assert(rc == 0); + assert(dl.mode == DRAGLOCK_PAIRS); + + rc = draglock_init_from_string(&dl, "1 2 3 4 5 0 7 8"); + assert(rc == 0); + assert(dl.mode == DRAGLOCK_PAIRS); + + /* all disabled */ + rc = draglock_init_from_string(&dl, "1 0 3 0 5 0 7 0"); + assert(rc == 0); + assert(dl.mode == DRAGLOCK_DISABLED); +} + +static void +test_config_get(void) +{ + struct draglock dl; + int rc; + const int sz = 32; + int map[sz]; + + draglock_init_from_string(&dl, ""); + rc = draglock_get_meta(&dl); + assert(rc == 0); + rc = draglock_get_pairs(&dl, map, sz); + assert(rc == 0); + + draglock_init_from_string(&dl, "8"); + rc = draglock_get_meta(&dl); + assert(rc == 8); + rc = draglock_get_pairs(&dl, map, sz); + assert(rc == 0); + + draglock_init_from_string(&dl, "1 2 3 4 5 6"); + rc = draglock_get_meta(&dl); + assert(rc == 0); + rc = draglock_get_pairs(&dl, map, sz); + assert(rc == 5); + assert(map[0] == 0); + assert(map[1] == 2); + assert(map[2] == 0); + assert(map[3] == 4); + assert(map[4] == 0); + assert(map[5] == 6); +} + +static void +test_set_meta(void) +{ + struct draglock dl; + int rc; + + draglock_init_from_string(&dl, ""); + + rc = draglock_set_meta(&dl, 0); + assert(rc == 0); + assert(dl.mode == DRAGLOCK_DISABLED); + + rc = draglock_set_meta(&dl, 1); + assert(rc == 0); + assert(dl.mode == DRAGLOCK_META); + + rc = draglock_set_meta(&dl, -1); + assert(rc == 1); + rc = draglock_set_meta(&dl, 32); + assert(rc == 1); +} + +static void +test_set_pairs(void) +{ + struct draglock dl; + int rc; + const int sz = 32; + int map[sz]; + + draglock_init_from_string(&dl, ""); + memset(map, 0, sizeof(map)); + + rc = draglock_set_pairs(&dl, map, sz); + assert(rc == 0); + assert(dl.mode == DRAGLOCK_DISABLED); + + rc = draglock_set_pairs(&dl, map, 1); + assert(rc == 0); + assert(dl.mode == DRAGLOCK_DISABLED); + + map[0] = 1; + rc = draglock_set_pairs(&dl, map, 1); + assert(rc == 1); + + map[0] = 0; + map[1] = 2; + rc = draglock_set_pairs(&dl, map, sz); + assert(rc == 0); + assert(dl.mode == DRAGLOCK_PAIRS); + + map[0] = 0; + map[1] = 0; + map[10] = 8; + rc = draglock_set_pairs(&dl, map, sz); + assert(rc == 0); + assert(dl.mode == DRAGLOCK_PAIRS); +} + +static void +test_filter_meta_passthrough(void) +{ + struct draglock dl; + int rc; + int button, press; + int i; + + rc = draglock_init_from_string(&dl, "10"); + + for (i = 0; i < 10; i++) { + button = i; + press = 1; + + rc = draglock_filter_button(&dl, &button, &press); + assert(rc == 0); + assert(button == i); + assert(press == 1); + + press = 1; + rc = draglock_filter_button(&dl, &button, &press); + assert(rc == 0); + assert(button == i); + assert(press == 1); + } +} + +static void +test_filter_meta_click_meta_only(void) +{ + struct draglock dl; + int rc; + int button, press; + + rc = draglock_init_from_string(&dl, "10"); + + button = 10; + press = 1; + + rc = draglock_filter_button(&dl, &button, &press); + assert(rc == 0); + assert(button == 0); + + button = 10; + press = 0; + rc = draglock_filter_button(&dl, &button, &press); + assert(rc == 0); + assert(button == 0); +} + +static void +test_filter_meta(void) +{ + struct draglock dl; + int rc; + int button, press; + int i; + + rc = draglock_init_from_string(&dl, "10"); + + for (i = 1; i < 10; i++) { + /* meta down */ + button = 10; + press = 1; + rc = draglock_filter_button(&dl, &button, &press); + assert(rc == 0); + assert(button == 0); + + /* meta up */ + button = 10; + press = 0; + rc = draglock_filter_button(&dl, &button, &press); + assert(rc == 0); + assert(button == 0); + + /* button down -> passthrough */ + button = i; + press = 1; + rc = draglock_filter_button(&dl, &button, &press); + assert(rc == 0); + assert(button == i); + + /* button up -> eaten */ + button = i; + press = 0; + rc = draglock_filter_button(&dl, &button, &press); + assert(rc == 0); + assert(button == 0); + + /* button down -> eaten */ + button = i; + press = 1; + rc = draglock_filter_button(&dl, &button, &press); + assert(rc == 0); + assert(button == 0); + + /* button up -> passthrough */ + button = i; + press = 0; + rc = draglock_filter_button(&dl, &button, &press); + assert(rc == 0); + assert(button == i); + assert(press == 0); + } +} + +static void +test_filter_meta_extra_click(void) +{ + struct draglock dl; + int rc; + int button, press; + int i; + + rc = draglock_init_from_string(&dl, "10"); + + for (i = 1; i < 10; i++) { + /* meta down */ + button = 10; + press = 1; + rc = draglock_filter_button(&dl, &button, &press); + assert(rc == 0); + assert(button == 0); + + /* meta up */ + button = 10; + press = 0; + rc = draglock_filter_button(&dl, &button, &press); + assert(rc == 0); + assert(button == 0); + + /* button down -> passthrough */ + button = i; + press = 1; + rc = draglock_filter_button(&dl, &button, &press); + assert(rc == 0); + assert(button == i); + + /* button up -> eaten */ + button = i; + press = 0; + rc = draglock_filter_button(&dl, &button, &press); + assert(rc == 0); + assert(button == 0); + + /* meta down */ + button = 10; + press = 1; + rc = draglock_filter_button(&dl, &button, &press); + assert(rc == 0); + assert(button == 0); + + /* meta up */ + button = 10; + press = 0; + rc = draglock_filter_button(&dl, &button, &press); + assert(rc == 0); + assert(button == 0); + + /* button down -> eaten */ + button = i; + press = 1; + rc = draglock_filter_button(&dl, &button, &press); + assert(rc == 0); + assert(button == 0); + + /* button up -> passthrough */ + button = i; + press = 0; + rc = draglock_filter_button(&dl, &button, &press); + assert(rc == 0); + assert(button == i); + assert(press == 0); + } +} + +static void +test_filter_meta_interleaved(void) +{ + struct draglock dl; + int rc; + int button, press; + int i; + + rc = draglock_init_from_string(&dl, "10"); + + for (i = 1; i < 10; i++) { + /* meta down */ + button = 10; + press = 1; + rc = draglock_filter_button(&dl, &button, &press); + assert(rc == 0); + assert(button == 0); + + /* meta up */ + button = 10; + press = 0; + rc = draglock_filter_button(&dl, &button, &press); + assert(rc == 0); + assert(button == 0); + + /* button down -> passthrough */ + button = i; + press = 1; + rc = draglock_filter_button(&dl, &button, &press); + assert(rc == 0); + assert(button == i); + + /* button up -> eaten */ + button = i; + press = 0; + rc = draglock_filter_button(&dl, &button, &press); + assert(rc == 0); + assert(button == 0); + } + + for (i = 0; i < 10; i++) { + /* button down -> eaten */ + button = i; + press = 1; + rc = draglock_filter_button(&dl, &button, &press); + assert(rc == 0); + assert(button == 0); + + /* button up -> passthrough */ + button = i; + press = 0; + rc = draglock_filter_button(&dl, &button, &press); + assert(rc == 0); + assert(button == i); + assert(press == 0); + } +} + +static void +test_filter_pairs(void) +{ + struct draglock dl; + int rc; + int button, press; + int i; + + rc = draglock_init_from_string(&dl, "1 11 2 0 3 13 4 0 5 15 6 0 7 17 8 0 9 19"); + + for (i = 1; i < 10; i++) { + button = i; + press = 1; + + rc = draglock_filter_button(&dl, &button, &press); + assert(rc == 0); + if (i % 2) + assert(button == i + 10); + else + assert(button == i); + assert(press == 1); + + button = i; + press = 0; + rc = draglock_filter_button(&dl, &button, &press); + assert(rc == 0); + if (i % 2) { + assert(button == 0); + } else { + assert(button == i); + assert(press == 0); + } + } + + for (i = 1; i < 10; i++) { + button = i; + press = 1; + + rc = draglock_filter_button(&dl, &button, &press); + assert(rc == 0); + if (i % 2) { + assert(button == 0); + } else { + assert(button == i); + assert(press == 1); + } + + button = i; + press = 0; + rc = draglock_filter_button(&dl, &button, &press); + assert(rc == 0); + if (i % 2) + assert(button == i + 10); + else + assert(button == i); + assert(press == 0); + } +} + +int +main(int argc, char **argv) +{ + test_config_empty(); + test_config_invalid(); + test_config_disable(); + test_config_meta_button(); + test_config_button_pairs(); + + test_config_get(); + test_set_meta(); + test_set_pairs(); + + test_filter_meta_passthrough(); + test_filter_meta_click_meta_only(); + test_filter_meta(); + test_filter_meta_extra_click(); + test_filter_meta_interleaved(); + + test_filter_pairs(); + + return 0; +} |