diff options
author | jilles <jilles@FreeBSD.org> | 2010-05-09 16:15:40 +0000 |
---|---|---|
committer | jilles <jilles@FreeBSD.org> | 2010-05-09 16:15:40 +0000 |
commit | 3c5524966436b94e8e8cf2be33f539a27e3b67e9 (patch) | |
tree | d36d35e3a11bfacaecc89d07d287f3a897e424c8 /tools/regression/lib/libc/gen | |
parent | e9a796d71565b99dd0bd1e34ec08bc74e3e0e8c4 (diff) | |
download | FreeBSD-src-3c5524966436b94e8e8cf2be33f539a27e3b67e9.zip FreeBSD-src-3c5524966436b94e8e8cf2be33f539a27e3b67e9.tar.gz |
Generate some tests for sh's case command from the fnmatch tests.
I'm committing the generated files because I don't like a build dependency
for the sh(1) tests, and they are small and will not change much.
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); |