[SHELL32_APITEST]
authorGiannis Adamopoulos <gadamopoulos@reactos.org>
Sat, 12 Nov 2016 14:54:12 +0000 (14:54 +0000)
committerGiannis Adamopoulos <gadamopoulos@reactos.org>
Sat, 12 Nov 2016 14:54:12 +0000 (14:54 +0000)
- Add tests for the Initialize method for CDesktopFolder and CDrivesFolder.
- Add tests for CFSFolder to see how it behaves whhile not initialized.

svn path=/trunk/; revision=73212

rostests/apitests/shell32/CFSFolder.cpp [new file with mode: 0644]
rostests/apitests/shell32/CMakeLists.txt
rostests/apitests/shell32/CMyComputer.cpp
rostests/apitests/shell32/CShellDesktop.cpp
rostests/apitests/shell32/testlist.c

diff --git a/rostests/apitests/shell32/CFSFolder.cpp b/rostests/apitests/shell32/CFSFolder.cpp
new file mode 100644 (file)
index 0000000..d54f954
--- /dev/null
@@ -0,0 +1,100 @@
+/*
+ * PROJECT:         ReactOS api tests
+ * LICENSE:         LGPLv2.1+ - See COPYING.LIB in the top level directory
+ * PURPOSE:         Test for CMyComputer
+ * PROGRAMMER:      Giannis Adamopoulos
+ */
+
+#include "shelltest.h"
+#include <atlbase.h>
+#include <atlcom.h>
+#include <strsafe.h>
+
+#define NDEBUG
+#include <debug.h>
+#include <shellutils.h>
+
+VOID TestUninitialized()
+{
+    CComPtr<IShellFolder> psf;
+    CComPtr<IEnumIDList> penum;
+    CComPtr<IDropTarget> pdt;
+    CComPtr<IContextMenu> pcm;
+    CComPtr<IShellView> psv;
+    LPITEMIDLIST retrievedPidl;
+    ULONG pceltFetched;
+    HRESULT hr;
+
+    /* Create a CFSFolder */
+    hr = CoCreateInstance(CLSID_ShellFSFolder, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARG(IShellFolder, &psf));
+    ok(hr == S_OK, "hr = %lx\n", hr);
+
+    /* An uninitialized CFSFolder doesn't contain any items */
+    hr = psf->EnumObjects(NULL, 0, &penum);
+    ok(hr == S_OK, "hr = %lx\n", hr);
+    hr = penum->Next(0, &retrievedPidl, &pceltFetched);
+    ok(hr == S_FALSE, "hr = %lx\n", hr);
+    hr = penum->Next(1, &retrievedPidl, &pceltFetched);
+    ok(hr == S_FALSE, "hr = %lx\n", hr);
+
+    /* It supports viewing */
+    hr = psf->CreateViewObject(NULL, IID_PPV_ARG(IDropTarget, &pdt));
+    ok(hr == S_OK, "hr = %lx\n", hr);
+    hr = psf->CreateViewObject(NULL, IID_PPV_ARG(IContextMenu, &pcm));
+    ok(hr == S_OK, "hr = %lx\n", hr);
+    hr = psf->CreateViewObject(NULL, IID_PPV_ARG(IShellView, &psv));
+    ok(hr == S_OK, "hr = %lx\n", hr);
+
+    /* And its display name is ... "C:\Documents and Settings\" */
+    STRRET strretName;
+    hr = psf->GetDisplayNameOf(NULL,SHGDN_FORPARSING,&strretName);
+    ok(hr == S_OK, "hr = %lx\n", hr);
+    ok(strretName.uType == STRRET_WSTR, "strretName.uType == %x\n", strretName.uType);
+    ok(wcscmp(strretName.pOleStr, L"C:\\Documents and Settings\\") == 0, "wrong name, got: %S\n", strretName.pOleStr);
+
+    hr = psf->GetDisplayNameOf(NULL,SHGDN_FORPARSING|SHGDN_INFOLDER,&strretName);
+    ok(hr == E_INVALIDARG, "hr = %lx\n", hr);
+    
+    
+    
+    
+    /* Use Initialize method with  a dummy pidl and test the still non initialized CFSFolder */
+    CComPtr<IPersistFolder2> ppf2;
+    hr = psf->QueryInterface(IID_PPV_ARG(IPersistFolder2, &ppf2));
+    ok(hr == S_OK, "hr = %lx\n", hr);
+
+    /* Create a tiny pidl with no contents */
+    LPITEMIDLIST testpidl = (LPITEMIDLIST)SHAlloc(3 * sizeof(WORD));
+    testpidl->mkid.cb = 2 * sizeof(WORD);
+    *(WORD*)((char*)testpidl + (int)(2 * sizeof(WORD))) = 0;
+
+    hr = ppf2->Initialize(testpidl);
+    ok(hr == S_OK, "hr = %lx\n", hr);
+    
+    LPITEMIDLIST pidl;
+    hr = ppf2->GetCurFolder(&pidl);
+    ok(hr == S_OK, "hr = %lx\n", hr);
+    ok(pidl->mkid.cb == 2 * sizeof(WORD), "got wrong pidl size, cb = %x\n", pidl->mkid.cb);
+
+    /* methods that worked before, now fail */
+    hr = psf->GetDisplayNameOf(NULL,SHGDN_FORPARSING,&strretName);
+    ok(hr == E_FAIL, "hr = %lx\n", hr);
+    hr = psf->EnumObjects(NULL, 0, &penum);
+    ok(hr == HRESULT_FROM_WIN32(ERROR_CANCELLED), "hr = %lx\n", hr);
+    
+    /* The following continue to work though */
+    hr = psf->CreateViewObject(NULL, IID_PPV_ARG(IDropTarget, &pdt));
+    ok(hr == S_OK, "hr = %lx\n", hr);
+    hr = psf->CreateViewObject(NULL, IID_PPV_ARG(IContextMenu, &pcm));
+    ok(hr == S_OK, "hr = %lx\n", hr);
+    hr = psf->CreateViewObject(NULL, IID_PPV_ARG(IShellView, &psv));
+    ok(hr == S_OK, "hr = %lx\n", hr);
+
+}
+
+START_TEST(CFSFolder)
+{  
+    CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
+
+    TestUninitialized();
+}
\ No newline at end of file
index e150210..47ff34a 100644 (file)
@@ -4,6 +4,7 @@ set_cpp(WITH_RUNTIME)
 include_directories(${REACTOS_SOURCE_DIR}/sdk/lib/atl)
 
 add_executable(shell32_apitest
+    CFSFolder.cpp
     CMyComputer.cpp
     CShellDesktop.cpp
     CShellLink.cpp
index 68e42d2..06341b5 100644 (file)
@@ -49,6 +49,29 @@ TestShellFolder(
     ok(psv != psv_2, "Expected %p != %p\n", static_cast<PVOID>(psv), static_cast<PVOID>(psv_2));
 }
 
+VOID TestInitialize(_In_ IShellFolder2 *psf2)
+{
+    CComPtr<IPersistFolder2> ppf2;
+    HRESULT hr = psf2->QueryInterface(IID_PPV_ARG(IPersistFolder2, &ppf2));
+    ok(hr == S_OK, "hr = %lx\n", hr);
+
+    hr = ppf2->Initialize(NULL);
+    ok(hr == S_OK, "hr = %lx\n", hr);
+
+    hr = ppf2->Initialize((LPCITEMIDLIST)0xdeaddead);
+    ok(hr == S_OK, "hr = %lx\n", hr);
+
+    //crashes in xp
+    //hr = ppf2->GetCurFolder(NULL);
+    //ok(hr == E_INVALIDARG, "hr = %lx\n", hr);
+
+    LPITEMIDLIST pidl;
+    hr = ppf2->GetCurFolder(&pidl);
+    ok(hr == S_OK, "hr = %lx\n", hr);
+    // 0 in win10, 14 in xp
+    ok(pidl->mkid.cb == 0x14, "expected empty pidl got cb = %x\n", pidl->mkid.cb);
+}
+
 START_TEST(CMyComputer)
 {
     HRESULT hr;
@@ -78,4 +101,5 @@ START_TEST(CMyComputer)
     ok(psf2 == psf2_2, "Expected %p == %p\n", static_cast<PVOID>(psf2), static_cast<PVOID>(psf2_2));
 
     TestShellFolder(psf2);
+    TestInitialize(psf2);
 }
index 5a3a0d8..f589f8e 100644 (file)
@@ -184,6 +184,34 @@ TestShellFolder(
     ok(psv != psv_2, "Expected %p != %p\n", static_cast<PVOID>(psv), static_cast<PVOID>(psv_2));
 }
 
+VOID TestInitialize(_In_ IShellFolder *psf)
+{
+    CComPtr<IPersistFolder2> ppf2;
+    HRESULT hr = psf->QueryInterface(IID_PPV_ARG(IPersistFolder2, &ppf2));
+    ok(hr == S_OK, "hr = %lx\n", hr);
+
+    /* Create a tiny pidl with no contents */
+    LPITEMIDLIST testpidl = (LPITEMIDLIST)SHAlloc(3 * sizeof(WORD));
+    testpidl->mkid.cb = 2 * sizeof(WORD);
+    *(WORD*)((char*)testpidl + (int)(2 * sizeof(WORD))) = 0;
+
+    hr = ppf2->Initialize(testpidl);
+    ok(hr == E_INVALIDARG, "hr = %lx\n", hr);
+
+    //crashes in xp, works on win10
+    //hr = ppf2->Initialize(NULL);    
+    //ok(hr == S_OK, "hr = %lx\n", hr);
+    //hr = ppf2->Initialize((LPCITEMIDLIST)0xdeaddead);
+    //ok(hr == S_OK, "hr = %lx\n", hr);
+    //hr = ppf2->GetCurFolder(NULL);
+    //ok(hr == E_INVALIDARG, "hr = %lx\n", hr);
+
+    LPITEMIDLIST pidl;
+    hr = ppf2->GetCurFolder(&pidl);
+    ok(hr == S_OK, "hr = %lx\n", hr);
+    ok(pidl->mkid.cb == 0, "expected empty pidl got cb = %x\n", pidl->mkid.cb);
+}
+
 START_TEST(CShellDesktop)
 {
     HRESULT hr;
@@ -219,4 +247,5 @@ START_TEST(CShellDesktop)
 
     TestShellFolder(psf2);
     TestCompareIDList(psf);
+    TestInitialize(psf);
 }
index ff4999e..54a2171 100644 (file)
@@ -3,6 +3,7 @@
 #define STANDALONE
 #include <wine/test.h>
 
+extern void func_CFSFolder(void);
 extern void func_CMyComputer(void);
 extern void func_CShellDesktop(void);
 extern void func_CShellLink(void);
@@ -12,6 +13,7 @@ extern void func_SHParseDisplayName(void);
 
 const struct test winetest_testlist[] =
 {
+    { "CFSFolder", func_CFSFolder },
     { "CMyComputer", func_CMyComputer },
     { "CShellDesktop", func_CShellDesktop },
     { "CShellLink", func_CShellLink },