[COMCTL32_APITEST] Add propsheetv6 testcase (#1853)
[reactos.git] / modules / rostests / apitests / comctl32 / propsheet.c
1 /*
2 * PROJECT: ReactOS api tests
3 * LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
4 * PURPOSE: Test for property sheet
5 * COPYRIGHT: Copyright 2019 Katayama Hirofumi MZ (katayama.hirofumi.mz@gmail.com)
6 */
7 #include "wine/test.h"
8 #include <windows.h>
9 #include <windowsx.h>
10 #include <commctrl.h>
11 #include <prsht.h>
12
13 #define IDC_APPLY_BUTTON 12321
14
15 static BOOL s_bNotified;
16
17 static BOOL OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam)
18 {
19 s_bNotified = FALSE;
20 SetDlgItemTextW(hwnd, edt1, L"text");
21 SetTimer(hwnd, 999, 300, NULL);
22 return TRUE;
23 }
24
25 static void OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
26 {
27 switch (id)
28 {
29 case IDOK:
30 case IDCANCEL:
31 EndDialog(hwnd, id);
32 break;
33 case edt1:
34 if (codeNotify == EN_CHANGE)
35 {
36 s_bNotified = TRUE;
37 PropSheet_Changed(GetParent(hwnd), hwnd);
38 }
39 break;
40 }
41 }
42
43 static void OnTimer(HWND hwnd, UINT id)
44 {
45 HWND hwndParent, hwndApply;
46
47 KillTimer(hwnd, id);
48
49 ok_int(s_bNotified, TRUE);
50
51 hwndParent = GetParent(hwnd);
52 hwndApply = GetDlgItem(hwndParent, IDC_APPLY_BUTTON);
53 ok_int(IsWindowEnabled(hwndApply), FALSE);
54
55 PropSheet_Changed(hwndParent, hwnd);
56 ok_int(IsWindowEnabled(hwndApply), TRUE);
57
58 PropSheet_UnChanged(hwndParent, hwnd);
59 ok_int(IsWindowEnabled(hwndApply), FALSE);
60
61 PropSheet_PressButton(hwndParent, PSBTN_OK);
62 }
63
64 static INT_PTR CALLBACK
65 Page1DlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
66 {
67 switch (uMsg)
68 {
69 HANDLE_MSG(hwnd, WM_INITDIALOG, OnInitDialog);
70 HANDLE_MSG(hwnd, WM_COMMAND, OnCommand);
71 HANDLE_MSG(hwnd, WM_TIMER, OnTimer);
72 }
73 return 0;
74 }
75
76 typedef HPROPSHEETPAGE (WINAPI *FN_CreatePropertySheetPageW)(LPCPROPSHEETPAGEW);
77 typedef int (WINAPI *FN_PropertySheetW)(LPCPROPSHEETHEADERW);
78
79 START_TEST(propsheet)
80 {
81 PROPSHEETPAGEW psp;
82 PROPSHEETHEADERW header;
83 HPROPSHEETPAGE hpsp[1];
84 HMODULE hComCtl32;
85 FN_CreatePropertySheetPageW pCreatePropertySheetPageW;
86 FN_PropertySheetW pPropertySheetW;
87
88 hComCtl32 = LoadLibraryW(L"comctl32.dll");
89 pCreatePropertySheetPageW = (FN_CreatePropertySheetPageW)GetProcAddress(hComCtl32, "CreatePropertySheetPageW");
90 pPropertySheetW = (FN_PropertySheetW)GetProcAddress(hComCtl32, "PropertySheetW");
91
92 ok(pCreatePropertySheetPageW != NULL, "pCreatePropertySheetPageW was NULL.\n");
93 ok(pPropertySheetW != NULL, "pPropertySheetW was NULL.\n");
94
95 if (!pCreatePropertySheetPageW || !pPropertySheetW)
96 {
97 skip("!pCreatePropertySheetPageW || !pPropertySheetW\n");
98 return;
99 }
100
101 ZeroMemory(&psp, sizeof(psp));
102 psp.dwSize = sizeof(psp);
103 psp.dwFlags = PSP_DEFAULT;
104 psp.hInstance = GetModuleHandleW(NULL);
105 psp.pszTemplate = MAKEINTRESOURCEW(1);
106 psp.pfnDlgProc = Page1DlgProc;
107 hpsp[0] = (*pCreatePropertySheetPageW)(&psp);
108 ok(hpsp[0] != NULL, "hpsp[0] was NULL.\n");
109
110 ZeroMemory(&header, sizeof(header));
111 header.dwSize = sizeof(header);
112 header.dwFlags = 0;
113 header.hInstance = GetModuleHandleW(NULL);
114 header.hwndParent = NULL;
115 header.nPages = ARRAYSIZE(hpsp);
116 header.phpage = hpsp;
117 header.pszCaption = L"propsheet";
118 ok((*pPropertySheetW)(&header) > 0, "PropertySheet returned non-positive value.\n");
119
120 FreeLibrary(hComCtl32);
121 }