From: Lauri Kenttä Subject: [PATCH v3] kernel32/tests: Test FindFirstFile etc. with wildcards. Message-Id: <20161209140928.3950-1-lauri.kentta@gmail.com> Date: Fri, 9 Dec 2016 16:09:28 +0200 Inspired by bug 7961. v2: Remove file names which don't work on NTFS/FAT32. v3: Remove file names that match with exactly same wildcards. Signed-off-by: Lauri Kenttä --- dlls/kernel32/tests/file.c | 90 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) diff --git a/dlls/kernel32/tests/file.c b/dlls/kernel32/tests/file.c index 7839802..4ae1fe0 100644 --- a/dlls/kernel32/tests/file.c +++ b/dlls/kernel32/tests/file.c @@ -2816,6 +2816,95 @@ 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", ".aaa", + "a", "a..a", "a.a", "a.a.a", "aa", "aaa", "aaaa" + }; + static const struct { + int todo; + const char *pattern, *result; + } tests[] = { + {0, "*.*.*", ", '.', '..', '..a', '..a.a', '.a', '.a..a', '.a.a', '.aaa', 'a', 'a..a', 'a.a', 'a.a.a', 'aa', 'aaa', 'aaaa'"}, + {0, "*.*.", ", '.', '..', '..a', '..a.a', '.a', '.a..a', '.a.a', '.aaa', 'a', 'a..a', 'a.a', 'a.a.a', 'aa', 'aaa', 'aaaa'"}, + {0, ".*.*", ", '.', '..', '..a', '..a.a', '.a', '.a..a', '.a.a', '.aaa'"}, + {0, "*.*", ", '.', '..', '..a', '..a.a', '.a', '.a..a', '.a.a', '.aaa', 'a', 'a..a', 'a.a', 'a.a.a', 'aa', 'aaa', 'aaaa'"}, + {0, ".*", ", '.', '..', '..a', '..a.a', '.a', '.a..a', '.a.a', '.aaa'"}, + {1, "*.", ", '.', '..', 'a', '.a', '..a', 'aa', 'aaa', 'aaaa', '.aaa'"}, + {0, "*", ", '.', '..', '..a', '..a.a', '.a', '.a..a', '.a.a', '.aaa', 'a', 'a..a', 'a.a', 'a.a.a', 'aa', 'aaa', 'aaaa'"}, + {1, "*..*", ", '.', '..', '..a', '..a.a', '.a..a', 'a..a'"}, + {1, "*..", ", '.', '..', 'a', '.a', '..a', 'aa', 'aaa', 'aaaa', '.aaa'"}, + {1, ".*.", ", '.', '..', '.a', '.aaa'"}, + {0, "..*", ", '.', '..', '..a', '..a.a'"}, + {0, "**", ", '.', '..', '..a', '..a.a', '.a', '.a..a', '.a.a', '.aaa', 'a', 'a..a', 'a.a', 'a.a.a', 'aa', 'aaa', 'aaaa'"}, + {0, "**.", ", '.', '..', '..a', '..a.a', '.a', '.a..a', '.a.a', '.aaa', 'a', 'a..a', 'a.a', 'a.a.a', 'aa', 'aaa', 'aaaa'"}, + {0, "*. ", ", '.', '..', '..a', '..a.a', '.a', '.a..a', '.a.a', '.aaa', 'a', 'a..a', 'a.a', 'a.a.a', 'aa', 'aaa', 'aaaa'"}, + {1, "* .", ", '.', '..', 'a', '.a', '..a', 'aa', 'aaa', 'aaaa', '.aaa'"}, + {0, "* . ", ", '.', '..', '..a', '..a.a', '.a', '.a..a', '.a.a', '.aaa', 'a', 'a..a', 'a.a', 'a.a.a', 'aa', 'aaa', 'aaaa'"}, + {0, "*.. ", ", '.', '..', '..a', '..a.a', '.a', '.a..a', '.a.a', '.aaa', 'a', 'a..a', 'a.a', 'a.a.a', 'aa', 'aaa', 'aaaa'"}, + {1, "*. .", ", '.', '..', 'a', '.a', '..a', 'aa', 'aaa', 'aaaa', '.aaa'"}, + {1, "* ..", ", '.', '..', 'a', '.a', '..a', 'aa', 'aaa', 'aaaa', '.aaa'"}, + {1, " *..", ", '.aaa'"}, + {0, "..* ", ", '.', '..', '..a', '..a.a'"}, + {1, "?", ", '.', '..', 'a'"}, + {1, "?.", ", '.', '..', 'a'"}, + {1, "?. ", ", '.', '..', 'a'"}, + {1, "??.", ", '.', '..', 'a', 'aa'"}, + {1, "??. ", ", '.', '..', 'a', 'aa'"}, + {1, "???.", ", '.', '..', 'a', 'aa', 'aaa'"}, + {1, "?.??.", ", '.', '..', '.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 missing[512]; + strcpy(missing, tests[i].result); + + handle = FindFirstFileA(tests[i].pattern, &find_data); + if (handle) do { + char* ptr; + char quoted[16] = ", '"; + strncat(quoted, find_data.cFileName, 10); + strcat(quoted, "'"); + + if ((ptr = strstr(missing, quoted))) + { + int len = strlen(quoted); + while ((ptr[0] = ptr[len]) != 0) + ++ptr; + strcat(correct, quoted); + } + else + strcat(incorrect, quoted); + } while (FindNextFileA(handle, &find_data)); + FindClose(handle); + + todo_wine_if (tests[i].todo) + ok(missing[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", + missing[0] ? missing+2 : "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); @@ -4744,6 +4833,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