blob: c3e9ac8b9245a476e127175bac779b77ca555bbe [file] [log] [blame]
/************************************************************************
*
* 0.fnmatch.cpp - tests exercising the rw_fnmatch() helper function
*
* $Id$
*
************************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed
* with this work for additional information regarding copyright
* ownership. The ASF licenses this file to you under the Apache
* License, Version 2.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
* implied. See the License for the specific language governing
* permissions and limitations under the License.
*
**************************************************************************/
#include <rw_fnmatch.h> // for rw_fnmatch()
#include <stdio.h> // for fprintf(), stderr
#ifdef _RWSTD_OS_LINUX
# include <fnmatch.h> // for fnmatch()
# define FNMATCH(pat, str, arg) fnmatch (pat, str, arg)
#endif // _RWSTD_OS_LINUX
// the number of failed tests
static int nerrors;
static void
test (int line, int exp, const char *pat, const char *str)
{
const int result = rw_fnmatch (pat, str, 0);
#ifdef FNMATCH
const int native = FNMATCH (pat, str, 0);
#else // if !defined (FNMATCH)
const int native = exp;
#endif // FNMATCH
if (result != native || (-1 < exp && result != exp)) {
++nerrors;
fprintf (stderr,
"%d. rw_fnmatch(\"%s\", \"%s\", 0) ==> %d, "
"expected (native:own) %d:%d\n",
line, pat, str, result, native, exp);
}
}
int main ()
{
#define TEST(exp, pat, str) test (__LINE__, exp, pat, str)
TEST (0, "", "");
TEST (1, "", "a");
TEST (1, "a", "");
TEST (0, "a", "a");
TEST (1, "a", "b");
TEST (0, "ab", "ab");
TEST (1, "ab", "ac");
TEST (0, "abc", "abc");
TEST (1, "xbc", "abc");
TEST (1, "ayc", "abc");
TEST (1, "abz", "abc");
// exercise escaped characters
TEST (1, "\\a", "");
TEST (0, "\\a", "a");
TEST (1, "\\a", "\\a");
TEST (1, "\\\\", "");
TEST (0, "\\\\", "\\");
TEST (1, "\\?", "\\a");
TEST (0, "\\?", "?");
TEST (1, "\\?", "\\?");
TEST (0, "\\[", "[");
TEST (1, "\\[", "\\[");
TEST (0, "\\[a", "[a");
TEST (0, "\\[a]", "[a]");
TEST (0, "\\[a\\]", "[a]");
TEST (0, "\\[\\a\\]", "[a]");
// exercise the question mark pattern
TEST (1, "?", "");
TEST (0, "?", "a");
TEST (1, "?", "ab");
TEST (1, "\\?", "");
TEST (1, "\\?", "a");
TEST (0, "\\?", "?");
TEST (0, "a?", "ad");
TEST (0, "?b", "ab");
TEST (1, "?b", "ac");
TEST (0, "??", "ae");
TEST (1, "??", "aef");
TEST (0, "?bc", "abc");
TEST (0, "a?c", "abc");
TEST (0, "ab?", "abc");
TEST (0, "??c", "abc");
TEST (0, "a??", "abc");
TEST (0, "?b?", "abc");
TEST (1, "??c", "abz");
TEST (1, "a??", "xbc");
TEST (1, "?b?", "ayc");
TEST (0, "???", "abc");
TEST (1, "???", "ab");
TEST (1, "???", "abcd");
// exercise the asterisk pattern
TEST (0, "*", "");
TEST (0, "*", "a");
TEST (0, "*", "ab");
TEST (0, "*", "abc");
TEST (1, "\\*", "");
TEST (1, "\\*", "a");
TEST (0, "\\*", "*");
TEST (1, "\\*", "ab");
TEST (1, "\\*", "abc");
TEST (0, "**", "");
TEST (0, "**", "a");
TEST (0, "**", "ab");
TEST (0, "**", "abc");
TEST (1, "*\\*", "");
TEST (1, "*\\*", "a");
TEST (0, "*\\*", "a*");
TEST (0, "*\\*", "ab*");
TEST (1, "a*", "");
TEST (0, "a*", "a");
TEST (0, "a*", "ab");
TEST (0, "a*", "abc");
TEST (1, "a**", "");
TEST (0, "a**", "a");
TEST (0, "a**", "ab");
TEST (0, "a**", "abc");
TEST (1, "**c", "");
TEST (1, "**c", "a");
TEST (1, "**c", "ab");
TEST (0, "**c", "abc");
TEST (1, "**c", "abcd");
TEST (1, "a*z", "");
TEST (1, "a*z", "a");
TEST (1, "a*z", "ab");
TEST (1, "a*z", "abc");
TEST (0, "a*z", "abcz");
TEST (0, "a*z", "abcdz");
TEST (0, "a*z", "abcdez");
TEST (1, "ab*z", "");
TEST (1, "ab*z", "a");
TEST (1, "ab*z", "ab");
TEST (1, "ab*z", "abc");
TEST (0, "ab*z", "abcz");
TEST (0, "ab*z", "abcdz");
TEST (0, "ab*z", "abcdez");
TEST (1, "a*yz", "");
TEST (1, "a*yz", "a");
TEST (1, "a*yz", "ab");
TEST (1, "a*yz", "abc");
TEST (1, "a*yz", "abcz");
TEST (0, "a*yz", "abcyz");
TEST (0, "a*yz", "abcdyz");
TEST (1, "ab*yz", "");
TEST (1, "ab*yz", "a");
TEST (1, "ab*yz", "ab");
TEST (1, "ab*yz", "abc");
TEST (1, "ab*yz", "abcz");
TEST (0, "ab*yz", "abcyz");
TEST (0, "ab*yz", "abcdyz");
TEST (0, "ab*yz", "abcdeyz");
TEST (1, "ab*x*z", "");
TEST (1, "ab*x*z", "a");
TEST (1, "ab*x*z", "ab");
TEST (1, "ab*x*z", "abc");
TEST (1, "ab*x*z", "abcz");
TEST (1, "ab*x*z", "abcyz");
TEST (0, "ab*x*z", "abcxyz");
TEST (0, "ab*x*z", "abcxxyz");
TEST (0, "ab*x*z", "abcxyyz");
TEST (1, "*b*x*z", "");
TEST (1, "*b*x*z", "a");
TEST (1, "*b*x*z", "ab");
TEST (1, "*b*x*z", "abc");
TEST (1, "*b*x*z", "abcz");
TEST (1, "*b*x*z", "abcyz");
TEST (0, "*b*x*z", "bcxyz");
TEST (0, "*b*x*z", "abcxyz");
TEST (0, "*b*x*z", "aabcxyz");
TEST (0, "*b*x*z", "abcxxyz");
TEST (0, "*b*x*z", "abcxyyz");
TEST (1, "abc*klm*xyz", "");
TEST (1, "abc*klm*xyz", "a");
TEST (1, "abc*klm*xyz", "ak");
TEST (1, "abc*klm*xyz", "akx");
TEST (1, "abc*klm*xyz", "abkx");
TEST (1, "abc*klm*xyz", "abklx");
TEST (1, "abc*klm*xyz", "abklxy");
TEST (1, "abc*klm*xyz", "abcklxy");
TEST (1, "abc*klm*xyz", "abcklmxy");
TEST (0, "abc*klm*xyz", "abcklmxyz");
TEST (0, "abc*klm*xyz", "abcdklmxyz");
TEST (0, "abc*klm*xyz", "abcdklmnxyz");
// exercise simple bracket expressions
TEST (1, "[a]", "");
TEST (0, "[a]", "a");
TEST (1, "[a]", "b");
TEST (1, "[?]", "c");
TEST (0, "[?]", "?");
TEST (1, "[-]", "d");
TEST (0, "[-]", "-");
TEST (1, "[]]", "e");
TEST (0, "[]]", "]");
TEST (1, "[\\]]", "f");
TEST (1, "[\\]]", "\\");
TEST (0, "[\\]]", "]");
TEST (1, "[\\!a]", "");
TEST (0, "[\\!a]", "a");
TEST (1, "[\\!a]", "b");
TEST (0, "[\\!?]", "!");
TEST (0, "[\\!?]", "?");
TEST (0, "[\\!-]", "-");
TEST (0, "[\\!!]", "!");
TEST (0, "[\\\\!]", "\\");
TEST (1, "[ab]", "");
TEST (0, "[ab]", "a");
TEST (0, "[ab]", "b");
TEST (1, "[ab]", "c");
TEST (1, "[a]b", "");
TEST (1, "[a]b", "a");
TEST (0, "[a]b", "ab");
TEST (1, "[a]b", "b");
TEST (1, "a[b]", "");
TEST (1, "a[b]", "a");
TEST (0, "a[b]", "ab");
TEST (1, "a[b]", "b");
TEST (1, "a[bc]", "");
TEST (1, "a[bc]", "a");
TEST (0, "a[bc]", "ab");
TEST (0, "a[bc]", "ac");
TEST (1, "a[bc]", "abc");
TEST (1, "a[\\]]", "ab");
TEST (0, "a[\\]]", "a]");
TEST (1, "[abc]", "");
TEST (0, "[abc]", "a");
TEST (0, "[abc]", "b");
TEST (0, "[abc]", "c");
TEST (1, "[abc]", "ab");
TEST (1, "[abc]", "ac");
TEST (1, "[abc]", "abc");
// exercise negated bracket expressions
TEST (1, "[!a]", "");
TEST (1, "[!a]", "a");
TEST (0, "[!a]", "b");
TEST (1, "[!?]", "?");
TEST (0, "[!?]", "c");
TEST (1, "[!-]", "-");
TEST (0, "[!-]", "d");
TEST (1, "[!!]", "!");
TEST (0, "[!!]", "e");
TEST (1, "[!ab]", "");
TEST (1, "[!ab]", "a");
TEST (1, "[!ab]", "b");
TEST (0, "[!ab]", "c");
TEST (1, "[!a]b", "");
TEST (1, "[!a]b", "a");
TEST (1, "[!a]b", "ab");
TEST (1, "[!a]b", "b");
TEST (0, "[!a]b", "bb");
TEST (1, "a[!b]", "");
TEST (1, "a[!b]", "a");
TEST (1, "a[!b]", "ab");
TEST (1, "a[!b]", "b");
TEST (0, "a[!b]", "ac");
TEST (1, "a[!bc]", "");
TEST (1, "a[!bc]", "a");
TEST (1, "a[!bc]", "ab");
TEST (1, "a[!bc]", "ac");
TEST (0, "a[!bc]", "ad");
TEST (0, "a[!!?]", "ae");
TEST (0, "a[!?!]", "af");
TEST (0, "a[!?-]", "ag");
TEST (0, "a[!-?]", "ah");
TEST (1, "a[!bc]", "aae");
TEST (1, "a[!bc]", "abe");
TEST (1, "a[!bc]", "ace");
TEST (1, "[!abc]", "");
TEST (1, "[!abc]", "a");
TEST (1, "[!abc]", "b");
TEST (1, "[!abc]", "c");
TEST (0, "[!abc]", "d");
TEST (1, "[!abc]", "ab");
TEST (1, "[!abc]", "ac");
TEST (1, "[!abc]", "ad");
TEST (1, "[!abc]", "abc");
TEST (1, "[!abc]", "abcd");
TEST (1, "[!abc]d", "");
TEST (1, "[!abc]d", "a");
TEST (1, "[!abc]d", "b");
TEST (1, "[!abc]d", "c");
TEST (1, "[!abc]d", "d");
TEST (0, "[!abc]d", "dd");
TEST (1, "[!abc]d", "ab");
TEST (1, "[!abc]d", "ac");
TEST (1, "[!abc]d", "ad");
TEST (1, "[!abc]d", "abc");
TEST (1, "[!abc]d", "abcd");
// exercise bracket expressions with ranges
TEST (1, "[a-a]", "");
TEST (0, "[a-a]", "a");
TEST (1, "[a-a]", "b");
TEST (1, "[a-a]", "ab");
TEST (1, "[a-a]", "ba");
TEST (1, "[a-b]", "");
TEST (0, "[a-b]", "a");
TEST (0, "[a-b]", "b");
TEST (1, "[a-b]", "c");
TEST (1, "[a-c]", "");
TEST (0, "[a-c]", "a");
TEST (0, "[a-c]", "b");
TEST (0, "[a-c]", "c");
TEST (1, "[a-c]", "d");
TEST (1, "[a-ce]", "");
TEST (0, "[a-ce]", "a");
TEST (0, "[a-ce]", "b");
TEST (0, "[a-ce]", "c");
TEST (1, "[a-ce]", "d");
TEST (0, "[a-ce]", "e");
TEST (1, "[a-ce]", "f");
TEST (1, "[ac-e]", "");
TEST (0, "[ac-e]", "a");
TEST (1, "[ac-e]", "b");
TEST (0, "[ac-e]", "c");
TEST (0, "[ac-e]", "d");
TEST (0, "[ac-e]", "e");
TEST (1, "[ac-e]", "f");
TEST (1, "[ac-eg]", "");
TEST (0, "[ac-eg]", "a");
TEST (1, "[ac-eg]", "b");
TEST (0, "[ac-eg]", "c");
TEST (0, "[ac-eg]", "d");
TEST (0, "[ac-eg]", "e");
TEST (1, "[ac-eg]", "f");
TEST (0, "[ac-eg]", "g");
TEST (1, "[ac-egk-m]", "");
TEST (0, "[ac-egk-m]", "a");
TEST (1, "[ac-egk-m]", "b");
TEST (0, "[ac-egk-m]", "c");
TEST (0, "[ac-egk-m]", "d");
TEST (0, "[ac-egk-m]", "e");
TEST (1, "[ac-egk-m]", "f");
TEST (0, "[ac-egk-m]", "g");
TEST (1, "[ac-egk-m]", "h");
TEST (1, "[ac-egk-m]", "i");
TEST (1, "[ac-egk-m]", "j");
TEST (0, "[ac-egk-m]", "k");
TEST (0, "[ac-egk-m]", "l");
TEST (0, "[ac-egk-m]", "m");
TEST (1, "[ac-egk-m]", "n");
TEST (1, "[1-9][0-9]", "");
TEST (1, "[1-9][0-9]", "0");
TEST (1, "[1-9][0-9]", "1");
TEST (1, "[1-9][0-9]", "2");
TEST (1, "[1-9][0-9]", "00");
TEST (1, "[1-9][0-9]", "01");
TEST (0, "[1-9][0-9]", "10");
TEST (0, "[1-9][0-9]", "11");
TEST (0, "[1-9][0-9]", "12");
TEST (0, "[1-9][0-9]", "90");
TEST (0, "[1-9][0-9]", "99");
TEST (1, "[1-9][0-9]", "999");
TEST (1, "[1-9].[0-9]", "0.1");
TEST (0, "[1-9].[0-9]", "1.0");
TEST (1, "[1-9].[0-9]", "1.0.0");
// exercise mixed patterns
TEST (1, "[1-9].[0-9]*", "1.");
TEST (0, "[1-9].[0-9]*", "1.2");
TEST (0, "[1-9].[0-9]*", "1.23");
TEST (0, "[1-9].[0-9]*", "1.2x");
TEST (0, "[1-9]?[0-9]*", "1-2y");
TEST (1, "*-aix[1-9].[0-9]-xlc7.0.0.[0-9]", "ppc-aix4.3-xlc6.0");
TEST (1, "*-aix[1-9].[0-9]-xlc7.0.0.[0-9]", "ppc-aix5.2-xlc6.0");
TEST (0, "*-aix[1-9].[0-9]-xlc7.0.0.[0-9]", "ppc-aix4.3-xlc7.0.0.0");
// exercise incomplete patterns
TEST (1, "\\", "");
TEST (1, "\\", "a");
TEST (1, "\\", "\\");
TEST (1, "[", "");
TEST (1, "[", "a");
TEST (1, "[", "[");
TEST (1, "[a", "");
TEST (1, "[a", "[a");
// return 0 on success, 1 on failure
return !(0 == nerrors);
}