From 5140250273ff02621ae286a68cd75b47a2695e43 Mon Sep 17 00:00:00 2001 From: Daniel Stone Date: Sat, 25 Apr 2009 18:15:02 +1000 Subject: [PATCH] Add testcase for XkbcCanonicaliseComponents Should be reasonably thorough; the shell part is, however, quite unpleasant. Signed-off-by: Daniel Stone --- test/Makefile.am | 7 +++-- test/canonicalise.c | 87 ++++++++++++++++++++++++++++++++++++++++++++++++++++ test/canonicalise.sh | 57 ++++++++++++++++++++++++++++++++++ 3 files changed, 149 insertions(+), 2 deletions(-) create mode 100644 test/canonicalise.c create mode 100755 test/canonicalise.sh diff --git a/test/Makefile.am b/test/Makefile.am index bf5855c..0ca07f4 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -3,8 +3,8 @@ AM_CFLAGS = $(X11_CFLAGS) $(CWARNFLAGS) TESTS_ENVIRONMENT = $(SHELL) -check_PROGRAMS = xkey filecomp namescomp rulescomp -TESTS = xkey.sh filecomp.sh namescomp.sh rulescomp.sh +check_PROGRAMS = xkey filecomp namescomp rulescomp canonicalise +TESTS = xkey.sh filecomp.sh namescomp.sh rulescomp.sh canonicalise.sh clean-local: rm -f *.log @@ -20,3 +20,6 @@ namescomp_LDADD = $(top_builddir)/src/libxkbcommon.la filecomp_SOURCES = filecomp.c filecomp_LDADD = $(top_builddir)/src/libxkbcommon.la + +canonicalise_SOURCES = canonicalise.c +canonicalise_LDADD = $(top_builddir)/src/libxkbcommon.la diff --git a/test/canonicalise.c b/test/canonicalise.c new file mode 100644 index 0000000..5e96997 --- /dev/null +++ b/test/canonicalise.c @@ -0,0 +1,87 @@ +/* + * Copyright © 2009 Daniel Stone + * + * 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. + * + * Author: Daniel Stone + */ + +#include "X11/extensions/XKBcommon.h" +#include +#include +#include + +int main(int argc, char *argv[]) +{ + XkbComponentNamesRec *new, *old = NULL; + + if (argc != 6 && argc != 11) { + fprintf(stderr, "usage: canonicalise (new kccgst) [old kccgst]\n"); + return 1; + } + + + new = calloc(1, sizeof(*new)); + if (!new) { + fprintf(stderr, "failed to calloc new\n"); + return 1; + } + new->keycodes = strdup(argv[1]); + new->compat = strdup(argv[2]); + new->geometry = strdup(argv[3]); + new->symbols = strdup(argv[4]); + new->types = strdup(argv[5]); + + if (argc == 11) { + old = calloc(1, sizeof(*old)); + if (!old) { + fprintf(stderr, "failed to calloc old\n"); + return 1; + } + old->keycodes = strdup(argv[6]); + old->compat = strdup(argv[7]); + old->geometry = strdup(argv[8]); + old->symbols = strdup(argv[9]); + old->types = strdup(argv[10]); + } + + XkbcCanonicaliseComponents(new, old); + + printf("%s %s %s %s %s\n", new->keycodes, new->compat, new->geometry, + new->symbols, new->types); + + free(new->keycodes); + free(new->compat); + free(new->geometry); + free(new->symbols); + free(new->types); + free(new); + + if (old) { + free(old->keycodes); + free(old->compat); + free(old->geometry); + free(old->symbols); + free(old->types); + free(old); + } + + return 0; +} diff --git a/test/canonicalise.sh b/test/canonicalise.sh new file mode 100755 index 0000000..db3587c --- /dev/null +++ b/test/canonicalise.sh @@ -0,0 +1,57 @@ +#!/bin/sh -x + +srcdir=${srcdir-.} +builddir=${builddir-.} + +name=canonicalise +prog="$builddir/$name$EXEEXT" +log="$builddir/$name.log" + +log_kccgst() +{ + echo " keycodes: $1" >>"$log" + echo " compat: $2" >>"$log" + echo " geometry: $3" >>"$log" + echo " symbols: $4" >>"$log" + echo " types: $5" >>"$log" +} + +rm -f "$log" + +test() { + ret=`$prog $2 $3` + echo "Input (new):" >>"$log" + log_kccgst $2 + echo >>"$log" + echo "Input (old):" >>"$log" + log_kccgst $3 + echo >>"$log" + echo "Expecting:" >>"$log" + log_kccgst $1 + echo >>"$log" + echo "Received:" >>"$log" + log_kccgst $ret + echo >>"$log" + + ret=`echo "$ret" | sed -e 's/[ ]*/ /g;'` + exp=`echo "$1" | sed -e 's/[ ]*/ /g;'` + + if ! [ "$ret" = "$exp" ]; then + echo "Error: Return and expectations different" >>"$log" + exit 1 + fi +} + +# This is a bit of a horror, but I can't really remember how to properly +# handle arrays in shell, and I'm offline. +twopart_new="+inet(pc104) %+complete pc104 pc(pc104)+%+ctrl(nocaps) |complete" +twopart_old="xfree86 basic invalid us(dvorak) xfree86" +twopart_exp="xfree86+inet(pc104) basic+complete pc104 pc(pc104)+us(dvorak)+ctrl(nocaps) xfree86|complete" + +onepart_new="evdev complete pc104 pc(pc104)+us+compose(ralt) complete" +onepart_exp="evdev complete pc104 pc(pc104)+us+compose(ralt) complete" + +test "$twopart_exp" "$twopart_new" "$twopart_old" +echo >>"$log" +echo >>"$log" +test "$onepart_exp" "$onepart_new" -- 2.7.4