1 /*
2 * PROJECT: ReactOS API tests
3 * LICENSE: LGPL-2.1+ (https://spdx.org/licenses/LGPL-2.1+)
4 * PURPOSE: Test for SetFocus/GetFocus/GetGUIThreadInfo
5 * COPYRIGHT: Copyright 2024 Katayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com>
6 * Copyright 2024 Doug Lyons <douglyons@douglyons.com>
7 */
8
9 #include "precomp.h"
10 #include <versionhelpers.h>
11
12 #define COPYIMAGE_VALID_FLAGS ( \
13 LR_SHARED | LR_COPYFROMRESOURCE | LR_CREATEDIBSECTION | LR_LOADMAP3DCOLORS | 0x800 | \
14 LR_VGACOLOR | LR_LOADREALSIZE | LR_DEFAULTSIZE | LR_LOADTRANSPARENT | LR_LOADFROMFILE | \
15 LR_COPYDELETEORG | LR_COPYRETURNORG | LR_COLOR | LR_MONOCHROME \
16 )
17
18 #define LR_UNKNOWN_0x10000 0x10000
19
CreateTestImage(UINT uType)20 static HANDLE CreateTestImage(UINT uType)
21 {
22 HANDLE hImage;
23 switch (uType)
24 {
25 case IMAGE_BITMAP:
26 {
27 HDC hDC = CreateCompatibleDC(NULL);
28 hImage = (HANDLE)CreateCompatibleBitmap(hDC, 10, 10);
29 DeleteDC(hDC);
30 break;
31 }
32 case IMAGE_CURSOR:
33 hImage = (HANDLE)LoadCursor(NULL, IDC_ARROW);
34 break;
35 case IMAGE_ICON:
36 hImage = (HANDLE)LoadIcon(NULL, IDI_APPLICATION);
37 break;
38 }
39 return hImage;
40 }
41
42 static VOID
Test_CopyImage_Flags(UINT uType)43 Test_CopyImage_Flags(UINT uType)
44 {
45 UINT iBit, uBit, uValidFlags = COPYIMAGE_VALID_FLAGS;
46 HANDLE hImage, hCopiedImage;
47
48 if (IsWindowsVistaOrGreater())
49 uValidFlags |= LR_UNKNOWN_0x10000;
50
51 hImage = CreateTestImage(uType);
52 for (iBit = 0; iBit < sizeof(UINT) * CHAR_BIT; ++iBit)
53 {
54 uBit = (1 << iBit);
55
56 SetLastError(0xDEADFACE);
57 hCopiedImage = CopyImage(hImage, uType, 0, 0, uBit);
58
59 if (uValidFlags & uBit) // Valid flag?
60 {
61 ok(hCopiedImage != NULL, "iBit %u: uType %u: hCopiedImage was NULL\n", iBit, uType);
62 }
63 else
64 {
65 ok(hCopiedImage == NULL, "iBit %u: uType %u: hCopiedImage was %p\n", iBit, uType, hCopiedImage);
66 ok_err(ERROR_INVALID_PARAMETER);
67 }
68
69 if (hCopiedImage)
70 DeleteObject(hCopiedImage);
71
72 /* If the original image was deleted, re-create it */
73 if (uBit & LR_COPYDELETEORG)
74 hImage = CreateTestImage(uType);
75 }
76
77 DeleteObject(hImage);
78 }
79
80 static VOID
Test_CopyImage_hImage_NULL(void)81 Test_CopyImage_hImage_NULL(void)
82 {
83 HANDLE hImg;
84 DWORD LastError;
85
86 /* Test NULL HANDLE return and GetLastError return. */
87 SetLastError(0xdeadbeef);
88 hImg = CopyImage(NULL, IMAGE_ICON, 16, 16, LR_COPYFROMRESOURCE);
89 LastError = GetLastError();
90 ok(LastError == ERROR_INVALID_CURSOR_HANDLE, "Wrong error 0x%08lx returned\n", LastError);
91 ok(!hImg, "Image returned should have been NULL, hImg was %p\n", hImg);
92
93 SetLastError(0xdeadbeef);
94 hImg = CopyImage(NULL, IMAGE_BITMAP, 16, 16, LR_COPYFROMRESOURCE);
95 LastError = GetLastError();
96 ok(LastError == ERROR_INVALID_HANDLE, "Wrong error 0x%08lx returned\n", LastError);
97 ok(!hImg, "Image returned should have been NULL, hImg was %p\n", hImg);
98
99
100 SetLastError(0xdeadbeef);
101 hImg = CopyImage(NULL, IMAGE_CURSOR, 16, 16, LR_COPYFROMRESOURCE);
102 LastError = GetLastError();
103 ok(LastError == ERROR_INVALID_CURSOR_HANDLE, "Wrong error 0x%08lx returned\n", LastError);
104 ok(!hImg, "Image returned should have been NULL, hImg was %p\n", hImg);
105
106 /* Test bad Flags for Invalid Parameter return */
107 SetLastError(0xdeadbeef);
108 /* 0x80000000 is an invalid flag value */
109 hImg = CopyImage(NULL, IMAGE_BITMAP, 16, 16, 0x80000000);
110 LastError = GetLastError();
111 ok(LastError == ERROR_INVALID_PARAMETER, "Wrong error 0x%08lx returned\n", LastError);
112 ok(!hImg, "Image returned should have been NULL, hImg was %p\n", hImg);
113
114 /* Test bad Type (5) GetLastError return value. Not Icon, Cursor, or Bitmap. */
115 SetLastError(0xdeadbeef);
116 hImg = CopyImage(NULL, 5, 16, 16, LR_COPYFROMRESOURCE);
117 LastError = GetLastError();
118 ok(LastError == ERROR_INVALID_PARAMETER, "Wrong error 0x%08lx returned\n", LastError);
119 ok(!hImg, "Image returned should have been NULL, hImg was %p\n", hImg);
120
121 /* Test bad type (5) GetLastError return value with good HANDLE */
122 hImg = CreateTestImage(IMAGE_ICON);
123 SetLastError(0xdeadbeef);
124 hImg = CopyImage(hImg, 5, 16, 16, LR_COPYFROMRESOURCE);
125 LastError = GetLastError();
126 ok(LastError == ERROR_INVALID_PARAMETER, "Wrong error 0x%08lx returned\n", LastError);
127 ok(!hImg, "Image returned should have been NULL, hImg was %p\n", hImg);
128 DeleteObject(hImg);
129 }
130
START_TEST(CopyImage)131 START_TEST(CopyImage)
132 {
133 Test_CopyImage_Flags(IMAGE_BITMAP);
134 Test_CopyImage_Flags(IMAGE_CURSOR);
135 Test_CopyImage_Flags(IMAGE_ICON);
136 Test_CopyImage_hImage_NULL();
137 }
138