[SHELL32_APITEST] Add a test for the CUserNotification implementation. CORE-13177

This commit is contained in:
Hermès Bélusca-Maïto 2018-02-15 01:17:32 +01:00
parent fe4704fa64
commit 02d17df031
No known key found for this signature in database
GPG key ID: 3B2539C65E7B93D0
3 changed files with 182 additions and 0 deletions

View file

@ -12,6 +12,7 @@ list(APPEND SOURCE
CMyComputer.cpp
CShellDesktop.cpp
CShellLink.cpp
CUserNotification.cpp
menu.cpp
PathResolve.cpp
SHCreateFileExtractIconW.cpp

View file

@ -0,0 +1,179 @@
/*
* PROJECT: ReactOS API tests
* LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
* PURPOSE: Test for CUserNotification
* COPYRIGHT: Copyright 2018 Hermes Belusca-Maito
*/
#include "shelltest.h"
#define NDEBUG
#include <debug.h>
#define ok_hr(status, expected) ok_hex(status, expected)
#define HRESULT_CANCELLED HRESULT_FROM_WIN32(ERROR_CANCELLED)
/* An implementation of the IQueryContinue interface */
class CQueryContinue : public IQueryContinue
{
private:
HRESULT m_hContinue;
public:
CQueryContinue(HRESULT hContinue = S_OK) : m_hContinue(hContinue) {}
~CQueryContinue() {}
CQueryContinue& operator=(const CQueryContinue& qc)
{
if (this != &qc)
m_hContinue = qc.m_hContinue;
return *this;
}
CQueryContinue& operator=(HRESULT hContinue)
{
m_hContinue = hContinue;
return *this;
}
operator HRESULT()
{
return m_hContinue;
}
public:
// IUnknown
virtual ULONG STDMETHODCALLTYPE AddRef()
{
return 1;
}
virtual ULONG STDMETHODCALLTYPE Release()
{
return 0;
}
virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void **ppvObject)
{
return S_OK;
}
// IQueryContinue
virtual HRESULT STDMETHODCALLTYPE QueryContinue(void)
{
// TRACE("IQueryContinue::QueryContinue() returning 0x%lx\n", m_hContinue);
return m_hContinue;
}
};
static void
TestNotification(void)
{
HRESULT hr;
CComPtr<IUserNotification> pUserNotif;
CQueryContinue queryContinue(S_OK);
// hr = pUserNotif.CoCreateInstance(CLSID_UserNotification);
hr = ::CoCreateInstance(CLSID_UserNotification, NULL, CLSCTX_ALL,
/*IID_PPV_ARG(IUserNotification, &pUserNotif)*/
IID_IUserNotification, (void**)&pUserNotif);
ok(hr == S_OK, "CoCreateInstance, hr = 0x%lx\n", hr);
if (FAILED(hr))
{
skip("Could not instantiate IUserNotification\n");
return;
}
/* Set an invalid icon for the notification icon */
hr = pUserNotif->SetIconInfo((HICON)0xdeadbeef, L"Tooltip text");
ok_hr(hr, S_OK);
#if 0
/* Seting an invalid string would crash the application */
hr = pUserNotif->SetIconInfo(NULL, (LPCWSTR)0xdeadbeef);
ok_hr(hr, S_OK);
#endif
/* Set a default icon for the notification icon */
hr = pUserNotif->SetIconInfo(NULL, L"Tooltip text");
ok_hr(hr, S_OK);
/*
* Since just displaying a notification icon without balloon hangs (expected),
* for making this test automatable we instead just test balloon functionality
* where timeouts can be programmed.
*/
/* Set up a balloon associated to the notification icon */
hr = pUserNotif->SetBalloonInfo(L"Balloon title", L"Balloon text", NIIF_ERROR);
ok_hr(hr, S_OK);
/*
* Try to display twice the balloon if the user cancels it.
* Without setting balloon retry, we would wait for a very long time...
*/
hr = pUserNotif->SetBalloonRetry(2000, 1000, 2);
ok_hr(hr, S_OK);
/* Display the balloon and also the tooltip if one points on the icon */
hr = pUserNotif->Show(NULL, 0);
ok_hr(hr, HRESULT_CANCELLED);
/*
* Setting icon information *after* having enabled balloon info,
* allows to automatically set the notification icon according
* to the dwInfoFlags passed to SetBalloonInfo() and by giving
* NULL to the hIcon parameter of SetIconInfo().
*/
hr = pUserNotif->SetIconInfo(NULL, NULL);
ok_hr(hr, S_OK);
/* Display the balloon and also the tooltip if one points on the icon */
hr = pUserNotif->Show(NULL, 0);
ok_hr(hr, HRESULT_CANCELLED);
/*
* This line shows the balloon, but without title nor icon in it.
* Note that the balloon icon is not displayed when not setting any title.
*/
hr = pUserNotif->SetBalloonInfo(NULL, L"Balloon text", NIIF_WARNING);
ok_hr(hr, S_OK);
hr = pUserNotif->Show(NULL, 0);
ok_hr(hr, HRESULT_CANCELLED);
/* Test support of the IQueryContinue interface */
hr = pUserNotif->SetBalloonInfo(L"Balloon title", L"Balloon text", NIIF_WARNING);
ok_hr(hr, S_OK);
hr = pUserNotif->Show(&queryContinue, 2000); /* Timeout of 2 seconds */
ok_hr(hr, HRESULT_CANCELLED);
#if 0 // Commented because this test (the Show() call) is unreliable.
/* Try to hide the balloon by setting an empty string (can use either NULL or L"") */
hr = pUserNotif->SetBalloonInfo(L"Balloon title", NULL, NIIF_WARNING);
ok_hr(hr, S_OK);
hr = pUserNotif->Show(&queryContinue, 2000); /* Timeout of 2 seconds */
ok_hr(hr, HRESULT_CANCELLED);
#endif
hr = pUserNotif->SetBalloonInfo(L"Balloon title", L"Balloon text", NIIF_WARNING);
ok_hr(hr, S_OK);
queryContinue = S_FALSE;
hr = pUserNotif->Show(&queryContinue, 2000); /* Timeout of 2 seconds */
ok_hr(hr, S_FALSE);
}
START_TEST(CUserNotification)
{
CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
TestNotification();
CoUninitialize();
}

View file

@ -9,6 +9,7 @@ extern void func_CFSFolder(void);
extern void func_CMyComputer(void);
extern void func_CShellDesktop(void);
extern void func_CShellLink(void);
extern void func_CUserNotification(void);
extern void func_menu(void);
extern void func_PathResolve(void);
extern void func_SHCreateFileExtractIconW(void);
@ -23,6 +24,7 @@ const struct test winetest_testlist[] =
{ "CMyComputer", func_CMyComputer },
{ "CShellDesktop", func_CShellDesktop },
{ "CShellLink", func_CShellLink },
{ "CUserNotification", func_CUserNotification },
{ "menu", func_menu },
{ "PathResolve", func_PathResolve },
{ "SHCreateFileExtractIconW", func_SHCreateFileExtractIconW },