[INCLUDE][SHELL32_APITEST] Add SHLimitInputEdit testcase (#2053)

- Add IItemNameLimits interface into shobjidl.idl.
- Add a testcase for shell32!SHLimitInputEdit function.
CORE-11701
This commit is contained in:
Katayama Hirofumi MZ 2019-11-18 20:02:18 +09:00 committed by GitHub
parent 9420daee3d
commit 6cc8e7db4b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 399 additions and 0 deletions

View file

@ -27,6 +27,7 @@ list(APPEND SOURCE
ShellExecCmdLine.cpp
ShellExecuteEx.cpp
ShellState.cpp
SHLimitInputEdit.cpp
menu.cpp
shelltest.cpp
shelltest.h)

View file

@ -0,0 +1,367 @@
/*
* PROJECT: ReactOS api tests
* LICENSE: LGPLv2.1+ - See COPYING.LIB in the top level directory
* PURPOSE: Test for SHLimitInputEdit
* PROGRAMMER: Katayama Hirofumi MZ
*/
#include "shelltest.h"
#include <shobjidl.h>
#include <shlwapi.h>
class CShellFolder
: public IShellFolder
, public IItemNameLimits
{
public:
LONG m_cRefs;
CShellFolder(INT iMaxNameLen = 0, BOOL bDisabled = FALSE)
: m_cRefs(1)
, m_iMaxNameLen(iMaxNameLen)
, m_bDisabled(bDisabled)
{
trace("CShellFolder\n");
}
virtual ~CShellFolder()
{
trace("~CShellFolder\n");
}
/*** IUnknown methods ***/
STDMETHODIMP QueryInterface(REFIID riid, void **ppvObject);
STDMETHODIMP_(ULONG) AddRef();
STDMETHODIMP_(ULONG) Release();
/*** IShellFolder methods ***/
STDMETHODIMP ParseDisplayName(
HWND hwnd,
IBindCtx *pbc,
LPWSTR pszDisplayName,
ULONG *pchEaten,
PIDLIST_RELATIVE *ppidl,
ULONG *pdwAttributes)
{
trace("ParseDisplayName\n");
return E_NOTIMPL;
}
STDMETHODIMP EnumObjects(
HWND hwnd,
SHCONTF grfFlags,
IEnumIDList **ppenumIDList)
{
trace("EnumObjects\n");
return E_NOTIMPL;
}
STDMETHODIMP BindToObject(
PCUIDLIST_RELATIVE pidl,
IBindCtx *pbc,
REFIID riid,
void **ppv)
{
trace("BindToObject\n");
return E_NOTIMPL;
}
STDMETHODIMP BindToStorage(
PCUIDLIST_RELATIVE pidl,
IBindCtx *pbc,
REFIID riid,
void **ppv)
{
trace("BindToStorage\n");
return E_NOTIMPL;
}
STDMETHODIMP CompareIDs(
LPARAM lParam,
PCUIDLIST_RELATIVE pidl1,
PCUIDLIST_RELATIVE pidl2)
{
trace("CompareIDs\n");
return E_NOTIMPL;
}
STDMETHODIMP CreateViewObject(
HWND hwndOwner,
REFIID riid,
void **ppv)
{
trace("CreateViewObject\n");
return E_NOTIMPL;
}
STDMETHODIMP GetAttributesOf(
UINT cidl,
PCUITEMID_CHILD_ARRAY apidl,
SFGAOF *rgfInOut)
{
trace("GetAttributesOf\n");
return E_NOTIMPL;
}
STDMETHODIMP GetUIObjectOf(
HWND hwndOwner,
UINT cidl,
PCUITEMID_CHILD_ARRAY apidl,
REFIID riid,
UINT *rgfReserved,
void **ppv)
{
trace("GetUIObjectOf\n");
return E_NOTIMPL;
}
STDMETHODIMP GetDisplayNameOf(
PCUITEMID_CHILD pidl,
SHGDNF uFlags,
STRRET *pName)
{
trace("GetDisplayNameOf\n");
return E_NOTIMPL;
}
STDMETHODIMP SetNameOf(
HWND hwnd,
PCUITEMID_CHILD pidl,
LPCWSTR pszName,
SHGDNF uFlags,
PITEMID_CHILD *ppidlOut)
{
trace("SetNameOf\n");
return E_NOTIMPL;
}
/*** IItemNameLimits methods ***/
STDMETHODIMP GetMaxLength(
LPCWSTR pszName,
int *piMaxNameLen);
STDMETHODIMP GetValidCharacters(
LPWSTR *ppwszValidChars,
LPWSTR *ppwszInvalidChars);
protected:
INT m_iMaxNameLen;
BOOL m_bDisabled;
};
STDMETHODIMP CShellFolder::QueryInterface(REFIID riid, void **ppvObject)
{
trace("QueryInterface\n");
if (!ppvObject)
return E_POINTER;
if (IsEqualIID(riid, IID_IShellFolder) || IsEqualIID(riid, IID_IUnknown))
{
trace("IID_IShellFolder\n");
*ppvObject = static_cast<IShellFolder *>(this);
AddRef();
return S_OK;
}
if (IsEqualIID(riid, IID_IItemNameLimits))
{
trace("IID_IItemNameLimits\n");
*ppvObject = static_cast<IItemNameLimits *>(this);
AddRef();
return S_OK;
}
return E_NOINTERFACE;
}
STDMETHODIMP_(ULONG) CShellFolder::AddRef()
{
trace("AddRef\n");
return ++m_cRefs;
}
STDMETHODIMP_(ULONG) CShellFolder::Release()
{
trace("Release\n");
if (--m_cRefs == 0)
{
//delete this;
return 0;
}
return m_cRefs;
}
STDMETHODIMP CShellFolder::GetMaxLength(
LPCWSTR pszName,
int *piMaxNameLen)
{
trace("GetMaxLength('%S', %p (%d))\n", pszName, piMaxNameLen, *piMaxNameLen);
if (!piMaxNameLen)
return E_POINTER;
*piMaxNameLen = m_iMaxNameLen;
return S_OK;
}
STDMETHODIMP CShellFolder::GetValidCharacters(
LPWSTR *ppwszValidChars,
LPWSTR *ppwszInvalidChars)
{
trace("GetValidCharacters(%p, %p)\n", ppwszValidChars, ppwszInvalidChars);
if (m_bDisabled)
return E_NOTIMPL;
if (ppwszInvalidChars)
{
SHStrDupW(L"/:*?\"<>|", ppwszInvalidChars);
}
if (ppwszValidChars)
{
*ppwszValidChars = NULL;
}
return S_OK;
}
static INT_PTR CALLBACK
DialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
if (uMsg != WM_INITDIALOG)
return FALSE;
HWND hEdt1 = GetDlgItem(hwnd, edt1);
INT n;
HRESULT hr;
WCHAR szText[64];
_SEH2_TRY
{
hr = SHLimitInputEdit(hEdt1, NULL);
}
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{
hr = 0xDEAD;
}
_SEH2_END;
ok_int(hr, 0xDEAD);
{
CShellFolder sf(123, FALSE);
ok_long(sf.m_cRefs, 1);
SendMessageW(hEdt1, EM_LIMITTEXT, 234, 0);
trace("GWLP_WNDPROC: %p\n", (void *)GetWindowLongPtr(hEdt1, GWLP_WNDPROC));
hr = SHLimitInputEdit(hEdt1, &sf);
ok_int(hr, S_OK);
ok_long(sf.m_cRefs, 1);
trace("GWLP_WNDPROC: %p\n", (void *)GetWindowLongPtr(hEdt1, GWLP_WNDPROC));
n = (INT)SendMessageW(hEdt1, EM_GETLIMITTEXT, 0, 0);
ok_int(n, 234);
}
{
CShellFolder sf(345, TRUE);
hr = SHLimitInputEdit(hEdt1, &sf);
ok_int(hr, E_NOTIMPL);
n = (INT)SendMessageW(hEdt1, EM_GETLIMITTEXT, 0, 0);
ok_int(n, 234);
}
{
CShellFolder sf(999, FALSE);
ok_long(sf.m_cRefs, 1);
SetWindowTextW(hEdt1, L"TEST/TEST");
hr = SHLimitInputEdit(hEdt1, &sf);
ok_int(hr, S_OK);
GetWindowTextW(hEdt1, szText, _countof(szText));
ok_wstr(szText, L"TEST/TEST");
ok_long(sf.m_cRefs, 1);
n = (INT)SendMessageW(hEdt1, EM_GETLIMITTEXT, 0, 0);
ok_int(n, 234);
SetWindowTextW(hEdt1, L"");
SendMessageW(hEdt1, WM_CHAR, L'A', 1);
GetWindowTextW(hEdt1, szText, _countof(szText));
ok_wstr(szText, L"A");
SendMessageW(hEdt1, WM_CHAR, L'/', 1);
GetWindowTextW(hEdt1, szText, _countof(szText));
ok_wstr(szText, L"A");
SendMessageW(hEdt1, WM_CHAR, L'/', 1);
GetWindowTextW(hEdt1, szText, _countof(szText));
ok_wstr(szText, L"A");
SendMessageW(hEdt1, WM_CHAR, L'A', 1);
GetWindowTextW(hEdt1, szText, _countof(szText));
ok_wstr(szText, L"AA");
}
{
CShellFolder sf(4, FALSE);
ok_long(sf.m_cRefs, 1);
SetWindowTextW(hEdt1, L"ABC");
hr = SHLimitInputEdit(hEdt1, &sf);
SendMessageW(hEdt1, WM_CHAR, L'D', 1);
GetWindowTextW(hEdt1, szText, _countof(szText));
ok_wstr(szText, L"DABC");
SendMessageW(hEdt1, WM_CHAR, L'E', 1);
GetWindowTextW(hEdt1, szText, _countof(szText));
ok_wstr(szText, L"DEABC");
ok_long(sf.m_cRefs, 1);
}
EndDialog(hwnd, IDABORT);
return TRUE;
}
START_TEST(SHLimitInputEdit)
{
HRESULT hr;
_SEH2_TRY
{
hr = SHLimitInputEdit(NULL, NULL);
}
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{
hr = 0xDEAD;
}
_SEH2_END;
ok_int(hr, 0xDEAD);
_SEH2_TRY
{
hr = SHLimitInputEdit((HWND)0xDEAD, NULL);
}
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{
hr = 0xDEAD;
}
_SEH2_END;
ok_int(hr, 0xDEAD);
DialogBoxW(GetModuleHandleW(NULL), L"SHLIMIT", NULL, DialogProc);
}

View file

@ -1,5 +1,16 @@
#include <windef.h>
#include <winuser.h>
#include <dlgs.h>
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
1 ICON "1.ico"
SHLIMIT DIALOG 0, 0, 122, 84
CAPTION "SHLIMIT"
STYLE DS_MODALFRAME | WS_POPUPWINDOW | WS_CAPTION
FONT 9, "Tahoma"
{
CONTROL "edt1", edt1, "EDIT", ES_AUTOHSCROLL | ES_MULTILINE | WS_BORDER | WS_TABSTOP, 19, 18, 80, 14
LTEXT "stc1", stc1, 24, 49, 72, 21
}

View file

@ -21,6 +21,7 @@ extern void func_SHCreateFileExtractIconW(void);
extern void func_ShellExecCmdLine(void);
extern void func_ShellExecuteEx(void);
extern void func_ShellState(void);
extern void func_SHLimitInputEdit(void);
extern void func_SHParseDisplayName(void);
const struct test winetest_testlist[] =
@ -43,6 +44,7 @@ const struct test winetest_testlist[] =
{ "ShellExecCmdLine", func_ShellExecCmdLine },
{ "ShellExecuteEx", func_ShellExecuteEx },
{ "ShellState", func_ShellState },
{ "SHLimitInputEdit", func_SHLimitInputEdit },
{ "SHParseDisplayName", func_SHParseDisplayName },
{ 0, 0 }
};

View file

@ -4745,4 +4745,22 @@ interface IUserNotification2 : IUnknown
[in, string] LPCWSTR pszSoundName);
};
/*****************************************************************************
* IItemNameLimits interface
*/
[
uuid(1df0d7f1-b267-4d28-8b10-12e23202a5c4)
]
interface IItemNameLimits : IUnknown
{
HRESULT GetValidCharacters(
[out, string] LPWSTR *ppwszValidChars,
[out, string] LPWSTR *ppwszInvalidChars);
HRESULT GetMaxLength(
[in, string] LPCWSTR pszName,
[out] int *piMaxNameLen);
};
#endif // __REACTOS__