blob: aa400b55f75c4053264bea23853f0dcb25389163 [file] [log] [blame]
/*
* Copyright (c) 2023 Meta
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <zephyr/posix/fnmatch.h>
#include <zephyr/ztest.h>
/*
* Adapted from
* https://git.musl-libc.org/cgit/libc-testsuite/tree/fnmatch.c
*/
ZTEST(posix_apis, test_fnmatch)
{
/* Note: commented out lines indicate known problems to be addressed in #55186 */
zassert_ok(fnmatch("*.c", "foo.c", 0));
zassert_ok(fnmatch("*.c", ".c", 0));
zassert_equal(fnmatch("*.a", "foo.c", 0), FNM_NOMATCH);
zassert_ok(fnmatch("*.c", ".foo.c", 0));
zassert_equal(fnmatch("*.c", ".foo.c", FNM_PERIOD), FNM_NOMATCH);
zassert_ok(fnmatch("*.c", "foo.c", FNM_PERIOD));
zassert_equal(fnmatch("a\\*.c", "a*.c", FNM_NOESCAPE), FNM_NOMATCH);
zassert_equal(fnmatch("a\\*.c", "ax.c", 0), FNM_NOMATCH);
zassert_ok(fnmatch("a[xy].c", "ax.c", 0));
zassert_ok(fnmatch("a[!y].c", "ax.c", 0));
zassert_equal(fnmatch("a[a/z]*.c", "a/x.c", FNM_PATHNAME), FNM_NOMATCH);
zassert_ok(fnmatch("a/*.c", "a/x.c", FNM_PATHNAME));
zassert_equal(fnmatch("a*.c", "a/x.c", FNM_PATHNAME), FNM_NOMATCH);
zassert_ok(fnmatch("*/foo", "/foo", FNM_PATHNAME));
zassert_ok(fnmatch("-O[01]", "-O1", 0));
/* zassert_ok(fnmatch("[[?*\\]", "\\", 0)); */
/* zassert_ok(fnmatch("[]?*\\]", "]", 0)); */
zassert_ok(fnmatch("[!]a-]", "b", 0));
zassert_ok(fnmatch("[]-_]", "^", 0));
zassert_ok(fnmatch("[!]-_]", "X", 0));
zassert_equal(fnmatch("??", "-", 0), FNM_NOMATCH);
zassert_equal(fnmatch("*LIB*", "lib", FNM_PERIOD), FNM_NOMATCH);
/* zassert_ok(fnmatch("a[/]b", "a/b", 0)); */
zassert_equal(fnmatch("a[/]b", "a/b", FNM_PATHNAME), FNM_NOMATCH);
zassert_ok(fnmatch("[a-z]/[a-z]", "a/b", 0));
zassert_equal(fnmatch("*", "a/b", FNM_PATHNAME), FNM_NOMATCH);
zassert_equal(fnmatch("*[/]b", "a/b", FNM_PATHNAME), FNM_NOMATCH);
zassert_equal(fnmatch("*[b]", "a/b", FNM_PATHNAME), FNM_NOMATCH);
zassert_equal(fnmatch("[*]/b", "a/b", 0), FNM_NOMATCH);
zassert_ok(fnmatch("[*]/b", "*/b", 0));
zassert_equal(fnmatch("[?]/b", "a/b", 0), FNM_NOMATCH);
zassert_ok(fnmatch("[?]/b", "?/b", 0));
zassert_ok(fnmatch("[[a]/b", "a/b", 0));
zassert_ok(fnmatch("[[a]/b", "[/b", 0));
zassert_equal(fnmatch("\\*/b", "a/b", 0), FNM_NOMATCH);
zassert_ok(fnmatch("\\*/b", "*/b", 0));
zassert_equal(fnmatch("\\?/b", "a/b", 0), FNM_NOMATCH);
zassert_ok(fnmatch("\\?/b", "?/b", 0));
zassert_ok(fnmatch("[/b", "[/b", 0));
zassert_ok(fnmatch("\\[/b", "[/b", 0));
zassert_ok(fnmatch("??"
"/b",
"aa/b", 0));
zassert_ok(fnmatch("???b", "aa/b", 0));
zassert_equal(fnmatch("???b", "aa/b", FNM_PATHNAME), FNM_NOMATCH);
zassert_equal(fnmatch("?a/b", ".a/b", FNM_PATHNAME | FNM_PERIOD), FNM_NOMATCH);
zassert_equal(fnmatch("a/?b", "a/.b", FNM_PATHNAME | FNM_PERIOD), FNM_NOMATCH);
zassert_equal(fnmatch("*a/b", ".a/b", FNM_PATHNAME | FNM_PERIOD), FNM_NOMATCH);
zassert_equal(fnmatch("a/*b", "a/.b", FNM_PATHNAME | FNM_PERIOD), FNM_NOMATCH);
/* zassert_equal(fnmatch("[.]a/b", ".a/b", FNM_PATHNAME | FNM_PERIOD), FNM_NOMATCH); */
/* zassert_equal(fnmatch("a/[.]b", "a/.b", FNM_PATHNAME | FNM_PERIOD), FNM_NOMATCH); */
zassert_ok(fnmatch("*/?", "a/b", FNM_PATHNAME | FNM_PERIOD));
zassert_ok(fnmatch("?/*", "a/b", FNM_PATHNAME | FNM_PERIOD));
zassert_ok(fnmatch(".*/?", ".a/b", FNM_PATHNAME | FNM_PERIOD));
zassert_ok(fnmatch("*/.?", "a/.b", FNM_PATHNAME | FNM_PERIOD));
zassert_equal(fnmatch("*/*", "a/.b", FNM_PATHNAME | FNM_PERIOD), FNM_NOMATCH);
zassert_ok(fnmatch("*?*/*", "a/.b", FNM_PERIOD));
zassert_ok(fnmatch("*[.]/b", "a./b", FNM_PATHNAME | FNM_PERIOD));
/* zassert_ok(fnmatch("*[[:alpha:]]/""*[[:alnum:]]", "a/b", FNM_PATHNAME)); */
zassert_not_equal(fnmatch("*[![:digit:]]*/[![:d-d]", "a/b", FNM_PATHNAME), 0);
zassert_not_equal(fnmatch("*[![:digit:]]*/[[:d-d]", "a/[", FNM_PATHNAME), 0);
zassert_not_equal(fnmatch("*[![:digit:]]*/[![:d-d]", "a/[", FNM_PATHNAME), 0);
zassert_ok(fnmatch("a?b", "a.b", FNM_PATHNAME | FNM_PERIOD));
zassert_ok(fnmatch("a*b", "a.b", FNM_PATHNAME | FNM_PERIOD));
zassert_ok(fnmatch("a[.]b", "a.b", FNM_PATHNAME | FNM_PERIOD));
}