diff options
Diffstat (limited to 'tools/regression/lib/libc/gen')
-rw-r--r-- | tools/regression/lib/libc/gen/Makefile | 4 | ||||
-rw-r--r-- | tools/regression/lib/libc/gen/test-fnmatch.c | 52 |
2 files changed, 55 insertions, 1 deletions
diff --git a/tools/regression/lib/libc/gen/Makefile b/tools/regression/lib/libc/gen/Makefile index 3e911e4..a79dc2f 100644 --- a/tools/regression/lib/libc/gen/Makefile +++ b/tools/regression/lib/libc/gen/Makefile @@ -9,3 +9,7 @@ tests: ${TESTS} .PHONY: clean clean: -rm -f ${TESTS} + +sh-tests: test-fnmatch + ./test-fnmatch -s 1 >../../../bin/sh/builtins/case2.0 + ./test-fnmatch -s 2 >../../../bin/sh/builtins/case3.0 diff --git a/tools/regression/lib/libc/gen/test-fnmatch.c b/tools/regression/lib/libc/gen/test-fnmatch.c index 6cbf8ee..2544067 100644 --- a/tools/regression/lib/libc/gen/test-fnmatch.c +++ b/tools/regression/lib/libc/gen/test-fnmatch.c @@ -31,6 +31,7 @@ __FBSDID("$FreeBSD$"); #include <stdio.h> #include <stdlib.h> #include <string.h> +#include <unistd.h> #include <fnmatch.h> struct testcase { @@ -210,13 +211,62 @@ flags_to_string(int flags) return result; } +static int +write_sh_tests(const char *progname, int num) +{ + size_t i, n; + struct testcase *t; + + printf("# Generated by %s -s %d, do not edit.\n", progname, num); + printf("# $" "FreeBSD$\n"); + printf("failures=\n"); + printf("failed() { printf '%%s\\n' \"Failed: $1 '$2' '$3'\"; failures=x$failures; }\n"); + if (num == 1) { + printf("testmatch() { eval \"case \\$2 in ''$1) ;; *) failed testmatch \\\"\\$@\\\";; esac\"; }\n"); + printf("testnomatch() { eval \"case \\$2 in ''$1) failed testnomatch \\\"\\$@\\\";; esac\"; }\n"); + } else if (num == 2) { + printf("# We do not treat a backslash specially in this case,\n"); + printf("# but this is not the case in all shells.\n"); + printf("netestmatch() { case $2 in $1) ;; *) failed netestmatch \"$@\";; esac; }\n"); + printf("netestnomatch() { case $2 in $1) failed netestnomatch \"$@\";; esac; }\n"); + } + n = sizeof(testcases) / sizeof(testcases[0]); + for (i = 0; i < n; i++) { + t = &testcases[i]; + if (strchr(t->pattern, '\'') != NULL || + strchr(t->string, '\'') != NULL) + continue; + if (num == 1 && t->flags == 0) + printf("test%smatch '%s' '%s'\n", + t->result == FNM_NOMATCH ? "no" : "", + t->pattern, t->string); + if (num == 2 && (t->flags == FNM_NOESCAPE || + (t->flags == 0 && strchr(t->pattern, '\\') == NULL))) + printf("netest%smatch '%s' '%s'\n", + t->result == FNM_NOMATCH ? "no" : "", + t->pattern, t->string); + } + printf("[ -z \"$failures\" ]\n"); + return 0; +} + int main(int argc, char *argv[]) { size_t i, n; - int flags, result, extra, errors; + int opt, flags, result, extra, errors; struct testcase *t; + while ((opt = getopt(argc, argv, "s:")) != -1) { + switch (opt) { + case 's': + return (write_sh_tests(argv[0], atoi(optarg))); + default: + fprintf(stderr, "usage: %s [-s num]\n", argv[0]); + fprintf(stderr, "-s option writes tests for sh(1), num is 1 or 2\n"); + exit(1); + } + } n = sizeof(testcases) / sizeof(testcases[0]); errors = 0; printf("1..%zu\n", n); |