MFC r207821: 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.
This commit is contained in:
Jilles Tjoelker 2010-05-15 12:42:07 +00:00
parent 1f0799c218
commit b6bcdd63bc
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/stable/8/; revision=208112
4 changed files with 256 additions and 1 deletions

View File

@ -0,0 +1,106 @@
# Generated by ./test-fnmatch -s 1, do not edit.
# $FreeBSD$
failures=
failed() { printf '%s\n' "Failed: $1 '$2' '$3'"; failures=x$failures; }
testmatch() { eval "case \$2 in ''$1) ;; *) failed testmatch \"\$@\";; esac"; }
testnomatch() { eval "case \$2 in ''$1) failed testnomatch \"\$@\";; esac"; }
testmatch '' ''
testmatch 'a' 'a'
testnomatch 'a' 'b'
testnomatch 'a' 'A'
testmatch '*' 'a'
testmatch '*' 'aa'
testmatch '*a' 'a'
testnomatch '*a' 'b'
testnomatch '*a*' 'b'
testmatch '*a*b*' 'ab'
testmatch '*a*b*' 'qaqbq'
testmatch '*a*bb*' 'qaqbqbbq'
testmatch '*a*bc*' 'qaqbqbcq'
testmatch '*a*bb*' 'qaqbqbb'
testmatch '*a*bc*' 'qaqbqbc'
testmatch '*a*bb' 'qaqbqbb'
testmatch '*a*bc' 'qaqbqbc'
testnomatch '*a*bb' 'qaqbqbbq'
testnomatch '*a*bc' 'qaqbqbcq'
testnomatch '*a*a*a*a*a*a*a*a*a*a*' 'aaaaaaaaa'
testmatch '*a*a*a*a*a*a*a*a*a*a*' 'aaaaaaaaaa'
testmatch '*a*a*a*a*a*a*a*a*a*a*' 'aaaaaaaaaaa'
testnomatch '.*.*.*.*.*.*.*.*.*.*' '.........'
testmatch '.*.*.*.*.*.*.*.*.*.*' '..........'
testmatch '.*.*.*.*.*.*.*.*.*.*' '...........'
testnomatch '*?*?*?*?*?*?*?*?*?*?*' '123456789'
testnomatch '??????????*' '123456789'
testnomatch '*??????????' '123456789'
testmatch '*?*?*?*?*?*?*?*?*?*?*' '1234567890'
testmatch '??????????*' '1234567890'
testmatch '*??????????' '1234567890'
testmatch '*?*?*?*?*?*?*?*?*?*?*' '12345678901'
testmatch '??????????*' '12345678901'
testmatch '*??????????' '12345678901'
testmatch '[x]' 'x'
testmatch '[*]' '*'
testmatch '[?]' '?'
testmatch '[' '['
testmatch '[[]' '['
testnomatch '[[]' 'x'
testnomatch '[*]' ''
testnomatch '[*]' 'x'
testnomatch '[?]' 'x'
testmatch '*[*]*' 'foo*foo'
testnomatch '*[*]*' 'foo'
testmatch '[0-9]' '0'
testmatch '[0-9]' '5'
testmatch '[0-9]' '9'
testnomatch '[0-9]' '/'
testnomatch '[0-9]' ':'
testnomatch '[0-9]' '*'
testnomatch '[!0-9]' '0'
testnomatch '[!0-9]' '5'
testnomatch '[!0-9]' '9'
testmatch '[!0-9]' '/'
testmatch '[!0-9]' ':'
testmatch '[!0-9]' '*'
testmatch '*[0-9]' 'a0'
testmatch '*[0-9]' 'a5'
testmatch '*[0-9]' 'a9'
testnomatch '*[0-9]' 'a/'
testnomatch '*[0-9]' 'a:'
testnomatch '*[0-9]' 'a*'
testnomatch '*[!0-9]' 'a0'
testnomatch '*[!0-9]' 'a5'
testnomatch '*[!0-9]' 'a9'
testmatch '*[!0-9]' 'a/'
testmatch '*[!0-9]' 'a:'
testmatch '*[!0-9]' 'a*'
testmatch '*[0-9]' 'a00'
testmatch '*[0-9]' 'a55'
testmatch '*[0-9]' 'a99'
testmatch '*[0-9]' 'a0a0'
testmatch '*[0-9]' 'a5a5'
testmatch '*[0-9]' 'a9a9'
testmatch '\*' '*'
testmatch '\?' '?'
testmatch '\[x]' '[x]'
testmatch '\[' '['
testmatch '\\' '\'
testmatch '*\**' 'foo*foo'
testnomatch '*\**' 'foo'
testmatch '*\\*' 'foo\foo'
testnomatch '*\\*' 'foo'
testmatch '\(' '('
testmatch '\a' 'a'
testnomatch '\*' 'a'
testnomatch '\?' 'a'
testnomatch '\*' '\*'
testnomatch '\?' '\?'
testnomatch '\[x]' '\[x]'
testnomatch '\[x]' '\x'
testnomatch '\[' '\['
testnomatch '\(' '\('
testnomatch '\a' '\a'
testmatch '.*' '.'
testmatch '.*' '..'
testmatch '.*' '.a'
testmatch 'a*' 'a.'
[ -z "$failures" ]

View File

@ -0,0 +1,95 @@
# Generated by ./test-fnmatch -s 2, do not edit.
# $FreeBSD$
failures=
failed() { printf '%s\n' "Failed: $1 '$2' '$3'"; failures=x$failures; }
# We do not treat a backslash specially in this case,
# but this is not the case in all shells.
netestmatch() { case $2 in $1) ;; *) failed netestmatch "$@";; esac; }
netestnomatch() { case $2 in $1) failed netestnomatch "$@";; esac; }
netestmatch '' ''
netestmatch 'a' 'a'
netestnomatch 'a' 'b'
netestnomatch 'a' 'A'
netestmatch '*' 'a'
netestmatch '*' 'aa'
netestmatch '*a' 'a'
netestnomatch '*a' 'b'
netestnomatch '*a*' 'b'
netestmatch '*a*b*' 'ab'
netestmatch '*a*b*' 'qaqbq'
netestmatch '*a*bb*' 'qaqbqbbq'
netestmatch '*a*bc*' 'qaqbqbcq'
netestmatch '*a*bb*' 'qaqbqbb'
netestmatch '*a*bc*' 'qaqbqbc'
netestmatch '*a*bb' 'qaqbqbb'
netestmatch '*a*bc' 'qaqbqbc'
netestnomatch '*a*bb' 'qaqbqbbq'
netestnomatch '*a*bc' 'qaqbqbcq'
netestnomatch '*a*a*a*a*a*a*a*a*a*a*' 'aaaaaaaaa'
netestmatch '*a*a*a*a*a*a*a*a*a*a*' 'aaaaaaaaaa'
netestmatch '*a*a*a*a*a*a*a*a*a*a*' 'aaaaaaaaaaa'
netestnomatch '.*.*.*.*.*.*.*.*.*.*' '.........'
netestmatch '.*.*.*.*.*.*.*.*.*.*' '..........'
netestmatch '.*.*.*.*.*.*.*.*.*.*' '...........'
netestnomatch '*?*?*?*?*?*?*?*?*?*?*' '123456789'
netestnomatch '??????????*' '123456789'
netestnomatch '*??????????' '123456789'
netestmatch '*?*?*?*?*?*?*?*?*?*?*' '1234567890'
netestmatch '??????????*' '1234567890'
netestmatch '*??????????' '1234567890'
netestmatch '*?*?*?*?*?*?*?*?*?*?*' '12345678901'
netestmatch '??????????*' '12345678901'
netestmatch '*??????????' '12345678901'
netestmatch '[x]' 'x'
netestmatch '[*]' '*'
netestmatch '[?]' '?'
netestmatch '[' '['
netestmatch '[[]' '['
netestnomatch '[[]' 'x'
netestnomatch '[*]' ''
netestnomatch '[*]' 'x'
netestnomatch '[?]' 'x'
netestmatch '*[*]*' 'foo*foo'
netestnomatch '*[*]*' 'foo'
netestmatch '[0-9]' '0'
netestmatch '[0-9]' '5'
netestmatch '[0-9]' '9'
netestnomatch '[0-9]' '/'
netestnomatch '[0-9]' ':'
netestnomatch '[0-9]' '*'
netestnomatch '[!0-9]' '0'
netestnomatch '[!0-9]' '5'
netestnomatch '[!0-9]' '9'
netestmatch '[!0-9]' '/'
netestmatch '[!0-9]' ':'
netestmatch '[!0-9]' '*'
netestmatch '*[0-9]' 'a0'
netestmatch '*[0-9]' 'a5'
netestmatch '*[0-9]' 'a9'
netestnomatch '*[0-9]' 'a/'
netestnomatch '*[0-9]' 'a:'
netestnomatch '*[0-9]' 'a*'
netestnomatch '*[!0-9]' 'a0'
netestnomatch '*[!0-9]' 'a5'
netestnomatch '*[!0-9]' 'a9'
netestmatch '*[!0-9]' 'a/'
netestmatch '*[!0-9]' 'a:'
netestmatch '*[!0-9]' 'a*'
netestmatch '*[0-9]' 'a00'
netestmatch '*[0-9]' 'a55'
netestmatch '*[0-9]' 'a99'
netestmatch '*[0-9]' 'a0a0'
netestmatch '*[0-9]' 'a5a5'
netestmatch '*[0-9]' 'a9a9'
netestmatch '\*' '\*'
netestmatch '\?' '\?'
netestmatch '\' '\'
netestnomatch '\\' '\'
netestmatch '\\' '\\'
netestmatch '*\*' 'foo\foo'
netestnomatch '*\*' 'foo'
netestmatch '.*' '.'
netestmatch '.*' '..'
netestmatch '.*' '.a'
netestmatch 'a*' 'a.'
[ -z "$failures" ]

View File

@ -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

View File

@ -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);