2019-08-18 09:53:37 +00:00
|
|
|
/*
|
|
|
|
* PROJECT: ReactOS api tests
|
|
|
|
* LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
|
2020-01-24 19:43:06 +00:00
|
|
|
* PURPOSE: Test for v6 property sheet
|
2019-08-18 09:53:37 +00:00
|
|
|
* COPYRIGHT: Copyright 2019 Katayama Hirofumi MZ (katayama.hirofumi.mz@gmail.com)
|
|
|
|
*/
|
2020-01-24 19:43:06 +00:00
|
|
|
|
2019-08-18 09:53:37 +00:00
|
|
|
#include "wine/test.h"
|
|
|
|
#include <windows.h>
|
|
|
|
#include <windowsx.h>
|
|
|
|
#include <commctrl.h>
|
|
|
|
#include <prsht.h>
|
|
|
|
|
|
|
|
#define IDC_APPLY_BUTTON 12321
|
|
|
|
|
|
|
|
static BOOL s_bNotified;
|
|
|
|
|
|
|
|
static BOOL OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam)
|
|
|
|
{
|
|
|
|
s_bNotified = FALSE;
|
|
|
|
SetDlgItemTextW(hwnd, edt1, L"text");
|
|
|
|
SetTimer(hwnd, 999, 300, NULL);
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
|
|
|
|
{
|
|
|
|
switch (id)
|
|
|
|
{
|
|
|
|
case IDOK:
|
|
|
|
case IDCANCEL:
|
|
|
|
EndDialog(hwnd, id);
|
|
|
|
break;
|
|
|
|
case edt1:
|
|
|
|
if (codeNotify == EN_CHANGE)
|
|
|
|
{
|
|
|
|
s_bNotified = TRUE;
|
|
|
|
PropSheet_Changed(GetParent(hwnd), hwnd);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void OnTimer(HWND hwnd, UINT id)
|
|
|
|
{
|
|
|
|
HWND hwndParent, hwndApply;
|
|
|
|
|
|
|
|
KillTimer(hwnd, id);
|
|
|
|
|
|
|
|
ok_int(s_bNotified, TRUE);
|
|
|
|
|
|
|
|
hwndParent = GetParent(hwnd);
|
|
|
|
hwndApply = GetDlgItem(hwndParent, IDC_APPLY_BUTTON);
|
|
|
|
ok_int(IsWindowEnabled(hwndApply), FALSE);
|
|
|
|
|
|
|
|
PropSheet_Changed(hwndParent, hwnd);
|
|
|
|
ok_int(IsWindowEnabled(hwndApply), TRUE);
|
|
|
|
|
|
|
|
PropSheet_UnChanged(hwndParent, hwnd);
|
|
|
|
ok_int(IsWindowEnabled(hwndApply), FALSE);
|
|
|
|
|
|
|
|
PropSheet_PressButton(hwndParent, PSBTN_OK);
|
|
|
|
}
|
|
|
|
|
|
|
|
static INT_PTR CALLBACK
|
|
|
|
Page1DlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
|
|
|
{
|
|
|
|
switch (uMsg)
|
|
|
|
{
|
|
|
|
HANDLE_MSG(hwnd, WM_INITDIALOG, OnInitDialog);
|
|
|
|
HANDLE_MSG(hwnd, WM_COMMAND, OnCommand);
|
|
|
|
HANDLE_MSG(hwnd, WM_TIMER, OnTimer);
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2020-01-24 19:43:06 +00:00
|
|
|
#ifdef _MSC_VER
|
|
|
|
#define CHECK_STRUCT_SIZE(x, y) C_ASSERT((x) == (y))
|
|
|
|
#else
|
|
|
|
// Can't do this compile time, thanks gcc
|
|
|
|
// 'error: non-nested function with variably modified type'
|
|
|
|
#define CHECK_STRUCT_SIZE(x, y) ok((x) == (y), "Wrong size for %s, got %u, expected %u\n", #x, y, x)
|
|
|
|
#endif
|
|
|
|
|
|
|
|
// Validate struct sizes
|
|
|
|
static void test_StructSizes()
|
|
|
|
{
|
|
|
|
#ifdef _M_X64
|
|
|
|
CHECK_STRUCT_SIZE(PROPSHEETPAGEA_V1_SIZE, 72);
|
|
|
|
CHECK_STRUCT_SIZE(PROPSHEETPAGEA_V2_SIZE, 88);
|
|
|
|
CHECK_STRUCT_SIZE(PROPSHEETPAGEA_V3_SIZE, 96);
|
|
|
|
CHECK_STRUCT_SIZE(PROPSHEETPAGEA_V4_SIZE, 104);
|
|
|
|
CHECK_STRUCT_SIZE(PROPSHEETHEADERA_V1_SIZE, 72);
|
|
|
|
CHECK_STRUCT_SIZE(PROPSHEETHEADERA_V2_SIZE, 96);
|
|
|
|
|
|
|
|
CHECK_STRUCT_SIZE(PROPSHEETPAGEW_V1_SIZE, 72);
|
|
|
|
CHECK_STRUCT_SIZE(PROPSHEETPAGEW_V2_SIZE, 88);
|
|
|
|
CHECK_STRUCT_SIZE(PROPSHEETPAGEW_V3_SIZE, 96);
|
|
|
|
CHECK_STRUCT_SIZE(PROPSHEETPAGEW_V4_SIZE, 104);
|
|
|
|
CHECK_STRUCT_SIZE(PROPSHEETHEADERW_V1_SIZE, 72);
|
|
|
|
CHECK_STRUCT_SIZE(PROPSHEETHEADERW_V2_SIZE, 96);
|
|
|
|
#else
|
|
|
|
CHECK_STRUCT_SIZE(PROPSHEETPAGEA_V1_SIZE, 40);
|
|
|
|
CHECK_STRUCT_SIZE(PROPSHEETPAGEA_V2_SIZE, 48);
|
|
|
|
CHECK_STRUCT_SIZE(PROPSHEETPAGEA_V3_SIZE, 52);
|
|
|
|
CHECK_STRUCT_SIZE(PROPSHEETPAGEA_V4_SIZE, 56);
|
|
|
|
CHECK_STRUCT_SIZE(PROPSHEETHEADERA_V1_SIZE, 40);
|
|
|
|
CHECK_STRUCT_SIZE(PROPSHEETHEADERA_V2_SIZE, 52);
|
|
|
|
|
|
|
|
CHECK_STRUCT_SIZE(PROPSHEETPAGEW_V1_SIZE, 40);
|
|
|
|
CHECK_STRUCT_SIZE(PROPSHEETPAGEW_V2_SIZE, 48);
|
|
|
|
CHECK_STRUCT_SIZE(PROPSHEETPAGEW_V3_SIZE, 52);
|
|
|
|
CHECK_STRUCT_SIZE(PROPSHEETPAGEW_V4_SIZE, 56);
|
|
|
|
CHECK_STRUCT_SIZE(PROPSHEETHEADERW_V1_SIZE, 40);
|
|
|
|
CHECK_STRUCT_SIZE(PROPSHEETHEADERW_V2_SIZE, 52);
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
2019-08-18 09:53:37 +00:00
|
|
|
typedef HPROPSHEETPAGE (WINAPI *FN_CreatePropertySheetPageW)(LPCPROPSHEETPAGEW);
|
|
|
|
typedef int (WINAPI *FN_PropertySheetW)(LPCPROPSHEETHEADERW);
|
2020-01-24 19:43:06 +00:00
|
|
|
static FN_CreatePropertySheetPageW pCreatePropertySheetPageW;
|
|
|
|
static FN_PropertySheetW pPropertySheetW;
|
2019-08-18 09:53:37 +00:00
|
|
|
|
2020-01-24 19:43:06 +00:00
|
|
|
// Show that the Apply button is not enabled by default
|
|
|
|
static void test_ApplyButtonDisabled()
|
2019-08-18 09:53:37 +00:00
|
|
|
{
|
2020-01-24 19:43:06 +00:00
|
|
|
PROPSHEETPAGEW psp = {0};
|
|
|
|
PROPSHEETHEADERW header = {0};
|
2019-08-18 09:53:37 +00:00
|
|
|
HPROPSHEETPAGE hpsp[1];
|
|
|
|
|
|
|
|
psp.dwSize = sizeof(psp);
|
|
|
|
psp.dwFlags = PSP_DEFAULT;
|
|
|
|
psp.hInstance = GetModuleHandleW(NULL);
|
|
|
|
psp.pszTemplate = MAKEINTRESOURCEW(1);
|
|
|
|
psp.pfnDlgProc = Page1DlgProc;
|
2020-01-24 19:43:06 +00:00
|
|
|
hpsp[0] = pCreatePropertySheetPageW(&psp);
|
2019-08-18 09:53:37 +00:00
|
|
|
ok(hpsp[0] != NULL, "hpsp[0] was NULL.\n");
|
|
|
|
|
|
|
|
header.dwSize = sizeof(header);
|
|
|
|
header.dwFlags = 0;
|
|
|
|
header.hInstance = GetModuleHandleW(NULL);
|
|
|
|
header.hwndParent = NULL;
|
|
|
|
header.nPages = ARRAYSIZE(hpsp);
|
|
|
|
header.phpage = hpsp;
|
|
|
|
header.pszCaption = L"propsheet";
|
2020-01-24 19:43:06 +00:00
|
|
|
ok(pPropertySheetW(&header) > 0, "PropertySheet returned non-positive value.\n");
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
START_TEST(propsheet)
|
|
|
|
{
|
|
|
|
HMODULE hComCtl32;
|
|
|
|
|
|
|
|
hComCtl32 = LoadLibraryW(L"comctl32.dll");
|
|
|
|
pCreatePropertySheetPageW = (FN_CreatePropertySheetPageW)GetProcAddress(hComCtl32, "CreatePropertySheetPageW");
|
|
|
|
pPropertySheetW = (FN_PropertySheetW)GetProcAddress(hComCtl32, "PropertySheetW");
|
|
|
|
|
|
|
|
ok(pCreatePropertySheetPageW != NULL, "pCreatePropertySheetPageW was NULL.\n");
|
|
|
|
ok(pPropertySheetW != NULL, "pPropertySheetW was NULL.\n");
|
|
|
|
|
|
|
|
if (!pCreatePropertySheetPageW || !pPropertySheetW)
|
|
|
|
{
|
|
|
|
skip("!pCreatePropertySheetPageW || !pPropertySheetW\n");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
test_StructSizes();
|
|
|
|
test_ApplyButtonDisabled();
|
2019-08-18 09:53:37 +00:00
|
|
|
|
|
|
|
FreeLibrary(hComCtl32);
|
|
|
|
}
|