Author: hbelusca Date: Mon Jan 16 16:22:40 2017 New Revision: 73560
URL: http://svn.reactos.org/svn/reactos?rev=73560&view=rev Log: [SHELL32_APITEST]: Add some tests for GetIconLocation. Show also that CShellLink inherits from IExtractIcon(A/W).
Modified: trunk/rostests/apitests/shell32/CShellLink.cpp
Modified: trunk/rostests/apitests/shell32/CShellLink.cpp URL: http://svn.reactos.org/svn/reactos/trunk/rostests/apitests/shell32/CShellLin... ============================================================================== --- trunk/rostests/apitests/shell32/CShellLink.cpp [iso-8859-1] (original) +++ trunk/rostests/apitests/shell32/CShellLink.cpp [iso-8859-1] Mon Jan 16 16:22:40 2017 @@ -221,12 +221,134 @@ psl->Release(); }
+ +/* Test IShellLink::Get/SetIconLocation and IExtractIcon::GetIconLocation */ +typedef struct +{ + PCWSTR FilePath; + + /* Expected results */ + HRESULT hrDefIcon; // Return value for GIL_DEFAULTICON + HRESULT hrForShrt; // Return value for GIL_FORSHORTCUT + /* Return values for GIL_FORSHELL */ + HRESULT hrForShell; + PCWSTR IconPath; + UINT Flags; +} TEST_SHELL_ICON; + +static TEST_SHELL_ICON ShIconTests[] = +{ + /* Executable with icons */ + {L"%SystemRoot%\system32\cmd.exe", S_FALSE, E_INVALIDARG, + S_OK, L"%SystemRoot%\system32\cmd.exe", GIL_NOTFILENAME | GIL_PERINSTANCE}, + + /* Executable without icon */ + {L"%SystemRoot%\system32\autochk.exe", S_FALSE, E_INVALIDARG, + S_OK, L"%SystemRoot%\system32\autochk.exe", GIL_NOTFILENAME | GIL_PERINSTANCE}, + + /* Existing file */ + {L"%SystemRoot%\system32\shell32.dll", S_FALSE, E_INVALIDARG, + S_OK, L"%SystemRoot%\system32\shell32.dll", GIL_NOTFILENAME | GIL_PERCLASS}, + + /* Non-existing file */ + {L"c:\non-existent-path\non-existent-file.sdf", S_FALSE, E_INVALIDARG, + S_OK, L"c:\non-existent-path\non-existent-file.sdf", GIL_NOTFILENAME | GIL_PERCLASS}, +}; + +static +VOID +test_iconlocation(UINT i, TEST_SHELL_ICON* testDef) +{ + HRESULT hr; + IShellLinkW *psl; + IExtractIconW *pei; + INT iIcon; + UINT wFlags; + WCHAR szPath[MAX_PATH]; + + hr = CoCreateInstance(CLSID_ShellLink, + NULL, + CLSCTX_INPROC_SERVER, + IID_PPV_ARG(IShellLinkW, &psl)); + ok(hr == S_OK, "CoCreateInstance, hr = 0x%lx\n", hr); + if (FAILED(hr)) + { + skip("Could not instantiate CShellLink\n"); + return; + } + + /* Set the path to a file */ + ExpandEnvironmentStringsW(testDef->FilePath, szPath, _countof(szPath)); + hr = psl->SetPath(szPath); + ok(hr == S_OK, "IShellLink::SetPath failed, hr = 0x%lx\n", hr); + + /* + * This test shows that this does not imply that the icon is automatically + * set and be retrieved naively by a call to IShellLink::GetIconLocation. + */ + iIcon = 0xdeadbeef; + wcscpy(szPath, L"garbage"); + hr = psl->GetIconLocation(szPath, _countof(szPath), &iIcon); + ok(hr == S_OK, "IShellLink::GetIconLocation(%d) failed, hr = 0x%lx\n", i, hr); + ok(*szPath == L'\0', "IShellLink::GetIconLocation(%d) returned '%S'\n", i, szPath); + ok(iIcon == 0, "IShellLink::GetIconLocation(%d) returned %d\n", i, iIcon); + + /* Try to grab the IExtractIconW interface */ + hr = psl->QueryInterface(IID_PPV_ARG(IExtractIconW, &pei)); + ok(hr == S_OK, "IShellLink::QueryInterface(IExtractIconW)(%d) failed, hr = 0x%lx\n", i, hr); + if (!pei) + { + win_skip("No IExtractIconW interface\n"); + psl->Release(); + return; + } + + iIcon = wFlags = 0xdeadbeef; + wcscpy(szPath, L"garbage"); + hr = pei->GetIconLocation(GIL_DEFAULTICON, szPath, _countof(szPath), &iIcon, &wFlags); + ok(hr == testDef->hrDefIcon, "IShellLink::GetIconLocation(%d) returned hr = 0x%lx, expected 0x%lx\n", i, hr, testDef->hrDefIcon); + ok(*szPath == L'\0', "IShellLink::GetIconLocation(%d) returned '%S'\n", i, szPath); + // ok(iIcon == 0, "IShellLink::GetIconLocation(%d) returned %d\n", i, iIcon); + + iIcon = wFlags = 0xdeadbeef; + wcscpy(szPath, L"garbage"); + hr = pei->GetIconLocation(GIL_FORSHORTCUT, szPath, _countof(szPath), &iIcon, &wFlags); + ok(hr == testDef->hrForShrt, "IShellLink::GetIconLocation(%d) returned hr = 0x%lx, expected 0x%lx\n", i, hr, testDef->hrForShrt); + // Here, both szPath and iIcon are untouched... + + iIcon = wFlags = 0xdeadbeef; + wcscpy(szPath, L"garbage"); + hr = pei->GetIconLocation(GIL_FORSHELL, szPath, _countof(szPath), &iIcon, &wFlags); + ok(hr == testDef->hrForShell, "IShellLink::GetIconLocation(%d) returned hr = 0x%lx, expected 0x%lx\n", i, hr, testDef->hrForShell); + ok(wFlags == testDef->Flags, "IShellLink::GetIconLocation(%d) returned wFlags = 0x%lx, expected 0x%lx\n", i, wFlags, testDef->Flags); + // ok(*szPath == L'\0', "IShellLink::GetIconLocation returned '%S'\n", szPath); + // ok(iIcon == 0, "IShellLink::GetIconLocation returned %d\n", iIcon); + // ok(FALSE, "hr = 0x%lx, szPath = '%S', iIcon = %d, wFlags = %d\n", hr, szPath, iIcon, wFlags); + + /* Release the interfaces */ + pei->Release(); + psl->Release(); +} + +static +VOID +TestIconLocation(void) +{ + UINT i; + + for (i = 0; i < _countof(ShIconTests); ++i) + { + test_iconlocation(i, &ShIconTests[i]); + } +} + START_TEST(CShellLink) { CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
TestShellLink(); TestDescription(); + TestIconLocation();
CoUninitialize(); }