Module: wine Branch: master Commit: 3a914b92fb742c39ccefb81c8854270f88414090 URL: http://source.winehq.org/git/wine.git/?a=commit;h=3a914b92fb742c39ccefb81c88...
Author: Dmitry Timoshkov dmitry@baikal.ru Date: Wed Feb 5 10:50:56 2014 +0900
scrrun/tests: Add more tests for IFileCollection using a dedicated temporary directory.
---
dlls/scrrun/tests/filesystem.c | 172 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 167 insertions(+), 5 deletions(-)
diff --git a/dlls/scrrun/tests/filesystem.c b/dlls/scrrun/tests/filesystem.c index c764ae7..2b7118f 100644 --- a/dlls/scrrun/tests/filesystem.c +++ b/dlls/scrrun/tests/filesystem.c @@ -1,6 +1,7 @@ /* * * Copyright 2012 Alistair Leslie-Hughes + * Copyright 2014 Dmitry Timoshkov * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -784,6 +785,7 @@ static void test_GetFolder(void) IFolder_Release(folder); }
+/* Please keep the tests for IFolderCollection and IFileCollection in sync */ static void test_FolderCollection(void) { static const WCHAR fooW[] = {'\','f','o','o',0}; @@ -901,6 +903,8 @@ static void test_FolderCollection(void) found_b++; else if (!lstrcmpW(str, cW + 1)) found_c++; + else + ok(0, "unexpected folder %s was found\n", wine_dbgstr_w(str)); SysFreeString(str);
IFolder_Release(folder); @@ -955,15 +959,31 @@ static void test_FolderCollection(void) IFolderCollection_Release(folders); }
+/* Please keep the tests for IFolderCollection and IFileCollection in sync */ static void test_FileCollection(void) { - IFileCollection *files; - WCHAR buffW[MAX_PATH]; + static const WCHAR fooW[] = {'\','f','o','o',0}; + static const WCHAR aW[] = {'\','a',0}; + static const WCHAR bW[] = {'\','b',0}; + static const WCHAR cW[] = {'\','c',0}; + WCHAR buffW[MAX_PATH], pathW[MAX_PATH]; IFolder *folder; + IFileCollection *files; + IFile *file; + IEnumVARIANT *enumvar, *clone; + LONG count, ref, ref2, i; + IUnknown *unk, *unk2; + ULONG fetched; + VARIANT var, var2[2]; HRESULT hr; BSTR str; + HANDLE file_a, file_b, file_c; + int found_a = 0, found_b = 0, found_c = 0;
- GetWindowsDirectoryW(buffW, MAX_PATH); + GetTempPathW(MAX_PATH, pathW); + GetTempFileNameW(pathW, fooW, 0, buffW); + DeleteFileW(buffW); + CreateDirectoryW(buffW, NULL);
str = SysAllocString(buffW); hr = IFileSystem3_GetFolder(fs3, str, &folder); @@ -973,11 +993,153 @@ static void test_FileCollection(void) hr = IFolder_get_Files(folder, NULL); ok(hr == E_POINTER, "got 0x%08x\n", hr);
+ lstrcpyW(pathW, buffW); + lstrcatW(pathW, aW); + file_a = CreateFileW(pathW, GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, + FILE_FLAG_DELETE_ON_CLOSE, 0); + lstrcpyW(pathW, buffW); + lstrcatW(pathW, bW); + file_b = CreateFileW(pathW, GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, + FILE_FLAG_DELETE_ON_CLOSE, 0); + hr = IFolder_get_Files(folder, &files); ok(hr == S_OK, "got 0x%08x\n", hr); - IFileCollection_Release(files); - IFolder_Release(folder); + + count = 0; + hr = IFileCollection_get_Count(files, &count); +todo_wine + ok(hr == S_OK, "got 0x%08x\n", hr); +todo_wine + ok(count == 2, "got %d\n", count); + + lstrcpyW(pathW, buffW); + lstrcatW(pathW, cW); + file_c = CreateFileW(pathW, GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, + FILE_FLAG_DELETE_ON_CLOSE, 0); + + /* every time property is requested it scans directory */ + count = 0; + hr = IFileCollection_get_Count(files, &count); +todo_wine + ok(hr == S_OK, "got 0x%08x\n", hr); +todo_wine + ok(count == 3, "got %d\n", count); + + hr = IFileCollection_get__NewEnum(files, NULL); + ok(hr == E_POINTER, "got 0x%08x\n", hr); + + hr = IFileCollection_QueryInterface(files, &IID_IEnumVARIANT, (void**)&unk); + ok(hr == E_NOINTERFACE, "got 0x%08x\n", hr); + + /* NewEnum creates new instance each time it's called */ + ref = GET_REFCOUNT(files); + + unk = NULL; + hr = IFileCollection_get__NewEnum(files, &unk); + ok(hr == S_OK, "got 0x%08x\n", hr); + + ref2 = GET_REFCOUNT(files); + ok(ref2 == ref + 1, "got %d, %d\n", ref2, ref); + + unk2 = NULL; + hr = IFileCollection_get__NewEnum(files, &unk2); + ok(hr == S_OK, "got 0x%08x\n", hr); + ok(unk != unk2, "got %p, %p\n", unk2, unk); + IUnknown_Release(unk2); + + /* now get IEnumVARIANT */ + ref = GET_REFCOUNT(files); + hr = IUnknown_QueryInterface(unk, &IID_IEnumVARIANT, (void**)&enumvar); + ok(hr == S_OK, "got 0x%08x\n", hr); + ref2 = GET_REFCOUNT(files); + ok(ref2 == ref, "got %d, %d\n", ref2, ref); + + /* clone enumerator */ + hr = IEnumVARIANT_Clone(enumvar, &clone); + ok(hr == S_OK, "got 0x%08x\n", hr); + ok(clone != enumvar, "got %p, %p\n", enumvar, clone); + IEnumVARIANT_Release(clone); + + hr = IEnumVARIANT_Reset(enumvar); + ok(hr == S_OK, "got 0x%08x\n", hr); + + for (i = 0; i < 3; i++) + { + VariantInit(&var); + fetched = 0; + hr = IEnumVARIANT_Next(enumvar, 1, &var, &fetched); + ok(hr == S_OK, "%d: got 0x%08x\n", i, hr); + ok(fetched == 1, "%d: got %d\n", i, fetched); + ok(V_VT(&var) == VT_DISPATCH, "%d: got type %d\n", i, V_VT(&var)); + + hr = IDispatch_QueryInterface(V_DISPATCH(&var), &IID_IFile, (void **)&file); + ok(hr == S_OK, "got 0x%08x\n", hr); + + str = NULL; + hr = IFile_get_Name(file, &str); + ok(hr == S_OK, "got 0x%08x\n", hr); + if (!lstrcmpW(str, aW + 1)) + found_a++; + else if (!lstrcmpW(str, bW + 1)) + found_b++; + else if (!lstrcmpW(str, cW + 1)) + found_c++; + else + ok(0, "unexpected file %s was found\n", wine_dbgstr_w(str)); + SysFreeString(str); + + /* FIXME: uncomment once Wine is fixed + IFile_Release(file); */ + VariantClear(&var); + } + +todo_wine + ok(found_a == 1 && found_b == 1 && found_c == 1, + "each file should be found 1 time instead of %d/%d/%d\n", + found_a, found_b, found_c); + + VariantInit(&var); + fetched = -1; + hr = IEnumVARIANT_Next(enumvar, 1, &var, &fetched); +todo_wine + ok(hr == S_FALSE, "got 0x%08x\n", hr); +todo_wine + ok(fetched == 0, "got %d\n", fetched); + + hr = IEnumVARIANT_Reset(enumvar); + ok(hr == S_OK, "got 0x%08x\n", hr); + hr = IEnumVARIANT_Skip(enumvar, 2); +todo_wine + ok(hr == S_OK, "got 0x%08x\n", hr); + hr = IEnumVARIANT_Skip(enumvar, 0); + ok(hr == S_OK, "got 0x%08x\n", hr); + + VariantInit(&var2[0]); + VariantInit(&var2[1]); + fetched = -1; + hr = IEnumVARIANT_Next(enumvar, 0, var2, &fetched); + ok(hr == S_OK, "got 0x%08x\n", hr); + ok(fetched == 0, "got %d\n", fetched); + fetched = -1; + hr = IEnumVARIANT_Next(enumvar, 2, var2, &fetched); +todo_wine + ok(hr == S_FALSE, "got 0x%08x\n", hr); +todo_wine + ok(fetched == 1, "got %d\n", fetched); + ok(V_VT(&var2[0]) == VT_DISPATCH, "got type %d\n", V_VT(&var2[0])); + VariantClear(&var2[0]); + VariantClear(&var2[1]); + + IEnumVARIANT_Release(enumvar); + IUnknown_Release(unk); + + CloseHandle(file_a); + CloseHandle(file_b); + CloseHandle(file_c); + RemoveDirectoryW(buffW); + + IFileCollection_Release(files); }
START_TEST(filesystem)