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