[PATCH] kernel32/tests: Test FindFirstFile etc. with wildcards.
Lauri Kenttä
lauri.kentta at gmail.com
Sat Dec 3 13:47:21 CST 2016
Inspired by bug 7961.
Signed-off-by: Lauri Kenttä <lauri.kentta at gmail.com>
---
dlls/kernel32/tests/file.c | 98 ++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 98 insertions(+)
diff --git a/dlls/kernel32/tests/file.c b/dlls/kernel32/tests/file.c
index f039cf9..2842f64 100644
--- a/dlls/kernel32/tests/file.c
+++ b/dlls/kernel32/tests/file.c
@@ -2812,6 +2812,103 @@ cleanup:
RemoveDirectoryA("test-dir");
}
+static void test_FindFirstFile_wildcards(void)
+{
+ WIN32_FIND_DATAA find_data;
+ HANDLE handle;
+ int i, j, k;
+ static const char* files[] = {
+ "a", "a.a", "a.a.a", "a..a", "a..a.a", "a..a..a", "a.a..a",
+ ".a", ".a.a", ".a.a.a", ".a..a", ".a..a.a", ".a..a..a", ".a.a..a",
+ "..a", "..a.a", "..a.a.a", "..a..a", "..a..a.a", "..a..a..a", "..a.a..a",
+ "aa", "aaa", "aaaa", "aa.", ".aa", "aa.a", "a.aa", "aaa.", ".aaa",
+ };
+ static const struct {
+ int todo;
+ const char *pattern, *result;
+ } tests[] = {
+ {0, "*.*.*", "'.', '..', '.aaa', 'a.aa', 'aa.a', '.aa', 'aaaa', 'aaa', 'aa', '..a.a..a', '..a..a..a', '..a..a.a', '..a..a', '..a.a.a', '..a.a', '..a', '.a.a..a', '.a..a..a', '.a..a.a', '.a..a', '.a.a.a', '.a.a', '.a', 'a.a..a', 'a..a..a', 'a..a.a', 'a..a', 'a.a.a', 'a.a', 'a'"},
+ {0, "*.*.", "'.', '..', '.aaa', 'a.aa', 'aa.a', '.aa', 'aaaa', 'aaa', 'aa', '..a.a..a', '..a..a..a', '..a..a.a', '..a..a', '..a.a.a', '..a.a', '..a', '.a.a..a', '.a..a..a', '.a..a.a', '.a..a', '.a.a.a', '.a.a', '.a', 'a.a..a', 'a..a..a', 'a..a.a', 'a..a', 'a.a.a', 'a.a', 'a'"},
+ {0, ".*.*", "'.', '..', '.aaa', '.aa', '..a.a..a', '..a..a..a', '..a..a.a', '..a..a', '..a.a.a', '..a.a', '..a', '.a.a..a', '.a..a..a', '.a..a.a', '.a..a', '.a.a.a', '.a.a', '.a'"},
+ {0, "*.*", "'.', '..', '.aaa', 'a.aa', 'aa.a', '.aa', 'aaaa', 'aaa', 'aa', '..a.a..a', '..a..a..a', '..a..a.a', '..a..a', '..a.a.a', '..a.a', '..a', '.a.a..a', '.a..a..a', '.a..a.a', '.a..a', '.a.a.a', '.a.a', '.a', 'a.a..a', 'a..a..a', 'a..a.a', 'a..a', 'a.a.a', 'a.a', 'a'"},
+ {0, ".*", "'.', '..', '.aaa', '.aa', '..a.a..a', '..a..a..a', '..a..a.a', '..a..a', '..a.a.a', '..a.a', '..a', '.a.a..a', '.a..a..a', '.a..a.a', '.a..a', '.a.a.a', '.a.a', '.a'"},
+ {1, "*.", "'.', '..', 'aaaa', 'aaa', 'aa', 'a'"},
+ {0, "*", "'.', '..', '.aaa', 'a.aa', 'aa.a', '.aa', 'aaaa', 'aaa', 'aa', '..a.a..a', '..a..a..a', '..a..a.a', '..a..a', '..a.a.a', '..a.a', '..a', '.a.a..a', '.a..a..a', '.a..a.a', '.a..a', '.a.a.a', '.a.a', '.a', 'a.a..a', 'a..a..a', 'a..a.a', 'a..a', 'a.a.a', 'a.a', 'a'"},
+ {1, "*..*", "'.', '..', '..a.a..a', '..a..a..a', '..a..a.a', '..a..a', '..a.a.a', '..a.a', '..a', '.a.a..a', '.a..a..a', '.a..a.a', '.a..a', 'a.a..a', 'a..a..a', 'a..a.a', 'a..a'"},
+ {1, "*..", "'.', '..', 'aaaa', 'aaa', 'aa', 'a'"},
+ {1, ".*.", "'.', '..', '.aaa', '.aa', '.a'"},
+ {0, "..*", "'.', '..', '..a.a..a', '..a..a..a', '..a..a.a', '..a..a', '..a.a.a', '..a.a', '..a'"},
+ {0, "**", "'.', '..', '.aaa', 'a.aa', 'aa.a', '.aa', 'aaaa', 'aaa', 'aa', '..a.a..a', '..a..a..a', '..a..a.a', '..a..a', '..a.a.a', '..a.a', '..a', '.a.a..a', '.a..a..a', '.a..a.a', '.a..a', '.a.a.a', '.a.a', '.a', 'a.a..a', 'a..a..a', 'a..a.a', 'a..a', 'a.a.a', 'a.a', 'a'"},
+ {0, "**.", "'.', '..', '.aaa', 'a.aa', 'aa.a', '.aa', 'aaaa', 'aaa', 'aa', '..a.a..a', '..a..a..a', '..a..a.a', '..a..a', '..a.a.a', '..a.a', '..a', '.a.a..a', '.a..a..a', '.a..a.a', '.a..a', '.a.a.a', '.a.a', '.a', 'a.a..a', 'a..a..a', 'a..a.a', 'a..a', 'a.a.a', 'a.a', 'a'"},
+ {0, "*. ", "'.', '..', '.aaa', 'a.aa', 'aa.a', '.aa', 'aaaa', 'aaa', 'aa', '..a.a..a', '..a..a..a', '..a..a.a', '..a..a', '..a.a.a', '..a.a', '..a', '.a.a..a', '.a..a..a', '.a..a.a', '.a..a', '.a.a.a', '.a.a', '.a', 'a.a..a', 'a..a..a', 'a..a.a', 'a..a', 'a.a.a', 'a.a', 'a'"},
+ {1, "* .", "'.', '..', 'aaaa', 'aaa', 'aa', 'a'"},
+ {0, "* . ", "'.', '..', '.aaa', 'a.aa', 'aa.a', '.aa', 'aaaa', 'aaa', 'aa', '..a.a..a', '..a..a..a', '..a..a.a', '..a..a', '..a.a.a', '..a.a', '..a', '.a.a..a', '.a..a..a', '.a..a.a', '.a..a', '.a.a.a', '.a.a', '.a', 'a.a..a', 'a..a..a', 'a..a.a', 'a..a', 'a.a.a', 'a.a', 'a'"},
+ {0, "*.. ", "'.', '..', '.aaa', 'a.aa', 'aa.a', '.aa', 'aaaa', 'aaa', 'aa', '..a.a..a', '..a..a..a', '..a..a.a', '..a..a', '..a.a.a', '..a.a', '..a', '.a.a..a', '.a..a..a', '.a..a.a', '.a..a', '.a.a.a', '.a.a', '.a', 'a.a..a', 'a..a..a', 'a..a.a', 'a..a', 'a.a.a', 'a.a', 'a'"},
+ {1, "*. .", "'.', '..', 'aaaa', 'aaa', 'aa', 'a'"},
+ {1, "* ..", "'.', '..', 'aaaa', 'aaa', 'aa', 'a'"},
+ {1, " *..", "'a'"},
+ {0, "..* ", "'.', '..', '..a.a..a', '..a..a..a', '..a..a.a', '..a..a', '..a.a.a', '..a.a', '..a'"},
+ {1, "?", "'a'"},
+ {1, "?.", "'a'"},
+ {1, "?. ", "'a'"},
+ {1, "??.", "'aa', 'a'"},
+ {1, "??. ", "'aa', 'a'"},
+ {1, "???.", "'aaa', 'aa', 'a'"},
+ {1, "?.??.", "'.', 'a.aa', '.aa', '.a', 'a.a', 'a'"}
+ };
+
+ CreateDirectoryA("test-dir", NULL);
+ SetCurrentDirectoryA("test-dir");
+ for (i = 0; i < sizeof(files) / sizeof(files[0]); ++i)
+ _lclose(_lcreat(files[i], 0));
+
+ for (i = 0; i < sizeof(tests) / sizeof(tests[0]); ++i)
+ {
+ char correct[512] = "";
+ char incorrect[512] = "";
+ char missed[512];
+ strcpy(missed, tests[i].result);
+
+ handle = FindFirstFileA(tests[i].pattern, &find_data);
+ if (handle) do {
+ char quoted[16] = "'";
+ char* ptr;
+ strcat(quoted, find_data.cFileName);
+ strcat(quoted, "'");
+
+ /* Format results nicely. */
+ if (strstr(tests[i].result, quoted))
+ strcat(correct, ", "), strcat(correct, quoted);
+ else
+ strcat(incorrect, ", "), strcat(incorrect, quoted);
+ if ((ptr = strstr(missed, quoted)))
+ {
+ while ((*ptr++ = ' ') && *ptr && *ptr != ' ');
+ while (ptr != missed && ptr[-1] != '\'') *--ptr = ' ';
+ }
+ } while (FindNextFileA(handle, &find_data));
+ FindClose(handle);
+
+ /* Format results nicely. */
+ for (j = 0; missed[j] && missed[j] == ' '; ++j);
+ for (k = 0; (missed[k] = missed[j]) != 0; ++k)
+ for (++j; missed[j] && missed[j] == ' '; ++j);
+
+ todo_wine_if (tests[i].todo)
+ ok(missed[0] == 0 && incorrect[0] == 0,
+ "FindFirstFile with '%s' found correctly %s, found incorrectly %s, and missed %s\n",
+ tests[i].pattern,
+ correct[0] ? correct+2 : "none",
+ incorrect[0] ? incorrect+2 : "none",
+ missed[0] ? missed : "none");
+ }
+
+ for (i = 0; i < sizeof(files) / sizeof(files[0]); ++i)
+ DeleteFileA(files[i]);
+ SetCurrentDirectoryA("..");
+ RemoveDirectoryA("test-dir");
+}
+
static int test_Mapfile_createtemp(HANDLE *handle)
{
SetFileAttributesA(filename,FILE_ATTRIBUTE_NORMAL);
@@ -4740,6 +4837,7 @@ START_TEST(file)
test_MoveFileW();
test_FindFirstFileA();
test_FindNextFileA();
+ test_FindFirstFile_wildcards();
test_FindFirstFileExA(FindExInfoStandard, 0, 0);
test_FindFirstFileExA(FindExInfoStandard, 0, FIND_FIRST_EX_CASE_SENSITIVE);
test_FindFirstFileExA(FindExInfoStandard, 0, FIND_FIRST_EX_LARGE_FETCH);
--
2.10.2
More information about the wine-patches
mailing list