1 /* Unit test suite for user interface functions
2  *
3  * Copyright 2009 Nikolay Sivov
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Lesser General Public
7  * License as published by the Free Software Foundation; either
8  * version 2.1 of the License, or (at your option) any later version.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * Lesser General Public License for more details.
14  *
15  * You should have received a copy of the GNU Lesser General Public
16  * License along with this library; if not, write to the Free Software
17  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
18  */
19 
20 #define WINE_NO_INLINE_RECT
21 #include "wine/test.h"
22 #include "winbase.h"
23 #include "wingdi.h"
24 #include "winuser.h"
25 
test_FillRect(void)26 static void test_FillRect(void)
27 {
28     HDC hdc, hdcmem;
29     DWORD bits[64];
30     HBITMAP hbmp, oldhbmp;
31     COLORREF col;
32     HBRUSH old_brush;
33     RECT r;
34 
35     /* fill bitmap data with white */
36     memset(bits, 0xff, sizeof(bits));
37 
38     hdc = GetDC(0);
39     ok( hdc != NULL, "CreateDC rets %p\n", hdc);
40     /* create a memory dc */
41     hdcmem = CreateCompatibleDC(hdc);
42     ok(hdcmem != NULL, "CreateCompatibleDC rets %p\n", hdcmem);
43     /* test monochrome bitmap: should always work */
44     hbmp = CreateBitmap(32, 32, 1, 1, bits);
45     ok(hbmp != NULL, "CreateBitmap returns %p\n", hbmp);
46     oldhbmp = SelectObject(hdcmem, hbmp);
47     ok(oldhbmp != NULL, "SelectObject returned NULL\n"); /* a memdc always has a bitmap selected */
48     col = GetPixel(hdcmem, 0, 0);
49     ok( col == 0xffffff, "GetPixel returned %08x, expected 0xffffff\n", col);
50 
51     /* select black brush */
52     old_brush = SelectObject(hdcmem, GetStockObject(BLACK_BRUSH));
53     SetRect(&r, 0, 0, 5, 5);
54     FillRect(hdcmem, &r, 0);
55     SelectObject(hdcmem, old_brush);
56     /* bitmap filled with last selected brush */
57     col = GetPixel(hdcmem, 0, 0);
58     ok(col == 0, "GetPixel returned %08x, expected 0\n", col);
59 
60     SelectObject(hdcmem, oldhbmp);
61     DeleteObject(hbmp);
62     DeleteDC(hdcmem);
63     ReleaseDC(0, hdc);
64 }
65 
test_SubtractRect(void)66 static void test_SubtractRect(void)
67 {
68     RECT rect1;
69     RECT rect2;
70     RECT rectr;
71     BOOL result;
72 
73     /* source rectangles don't intersect */
74     SetRect(&rect1, 50, 50, 150, 100);
75     SetRect(&rect2, 250, 200, 1500, 1000);
76     result = SubtractRect(&rectr, &rect1, &rect2);
77     ok(result, "SubtractRect returned FALSE but subtraction should not be empty\n");
78     ok(result && rectr.left == 50 && rectr.top == 50 && rectr.right ==150
79        && rectr.bottom == 100, "wrong rect subtraction of SubtractRect (dest rect=%s)\n",
80        wine_dbgstr_rect(&rectr));
81 
82     /* source rect 2 partially overlaps rect 1 */
83     SetRect(&rect1, 2431, 626, 3427, 1608);
84     SetRect(&rect2, 2499, 626, 3427, 1608);
85     result = SubtractRect(&rectr, &rect1, &rect2);
86     ok(result, "SubtractRect returned FALSE but subtraction should not be empty\n");
87     ok(result && rectr.left == 2431 && rectr.top == 626 && rectr.right == 2499
88        && rectr.bottom == 1608, "wrong rect subtraction of SubtractRect (dest rect=%s)\n",
89        wine_dbgstr_rect(&rectr));
90 
91     /* source rect 2 partially overlaps rect 1 - dest is src rect 2 */
92     SetRect(&rect1, 2431, 626, 3427, 1608);
93     SetRect(&rect2, 2499, 626, 3427, 1608);
94     result = SubtractRect(&rect2, &rect1, &rect2);
95     ok(result, "SubtractRect returned FALSE but subtraction should not be empty\n");
96     ok(result && rectr.left == 2431 && rectr.top == 626 && rectr.right == 2499
97        && rectr.bottom == 1608, "wrong rect subtraction of SubtractRect (dest rect=%s)\n",
98        wine_dbgstr_rect(&rectr));
99 
100     /* source rect 2 completely overlaps rect 1 */
101     SetRect(&rect1, 250, 250, 400, 500);
102     SetRect(&rect2, 50, 50, 1500, 1000);
103     result = SubtractRect(&rectr, &rect1, &rect2);
104     ok(!result, "SubtractRect returned TRUE but subtraction should be empty (dest rect=%s)\n",
105        wine_dbgstr_rect(&rectr));
106 
107     /* source rect 2 completely overlaps rect 1 - dest is src rect 2 */
108     SetRect(&rect1, 250, 250, 400, 500);
109     SetRect(&rect2, 50, 50, 1500, 1000);
110     result = SubtractRect(&rect2, &rect1, &rect2);
111     ok(!result, "SubtractRect returned TRUE but subtraction should be empty (dest rect=%s)\n",
112        wine_dbgstr_rect(&rect2));
113 }
114 
test_EqualRect(void)115 static void test_EqualRect(void)
116 {
117     RECT rect1, rect2;
118     BOOL ret;
119 
120     SetRect(&rect1, 0, 0, 0, 0);
121     SetRect(&rect2, 1, 1, 1, 1);
122 
123     ret = EqualRect(NULL, NULL);
124     ok(!ret, "got %d\n", ret);
125 
126     ret = EqualRect(&rect1, NULL);
127     ok(!ret, "got %d\n", ret);
128 
129     ret = EqualRect(NULL, &rect2);
130     ok(!ret, "got %d\n", ret);
131 
132     ret = EqualRect(&rect1, &rect2);
133     ok(!ret, "got %d\n", ret);
134 
135     SetRect(&rect1, 0, 0, 10, 10);
136     SetRect(&rect2, 10, 10, 0, 0);
137 
138     ret = EqualRect(&rect1, &rect2);
139     ok(!ret, "got %d\n", ret);
140 
141     ret = EqualRect(&rect1, &rect1);
142     ok(ret, "got %d\n", ret);
143 
144     rect2 = rect1;
145     ret = EqualRect(&rect1, &rect2);
146     ok(ret, "got %d\n", ret);
147 }
148 
test_IsRectEmpty(void)149 static void test_IsRectEmpty(void)
150 {
151     BOOL ret;
152     unsigned int i;
153     static const struct {
154         RECT rect;
155         BOOL ret;
156     } rtest[] = {
157         {{0, 0, 0, 0}, TRUE},
158         {{127, 131, 127, 131}, TRUE},
159         {{MAXLONG, MAXLONG, MAXLONG, MAXLONG}, TRUE},
160         {{-1, -1, -1, -1}, TRUE},
161         {{-2011, -2017, -2011, -2017}, TRUE},
162         {{MINLONG, MINLONG, MINLONG, MINLONG}, TRUE},
163         /* Only width or height are 0 */
164         {{31, 37, 31, 41}, TRUE},
165         {{881, 883, 887, 883}, TRUE},
166         {{-1721, 1723, -1721, 7213}, TRUE},
167         /* Negative width and/or height */
168         {{11, 13, 5, 7}, TRUE},
169         {{-11, -13, -19, -23}, TRUE},
170         {{11, 13, -17, 19}, TRUE},
171         {{11, 13, 17, 11}, TRUE},
172         /* Non empty rects */
173         {{101, 103, 107, 109}, FALSE},
174         {{1, -9, 7, 3}, FALSE},
175         {{-109, -107, -103, -101}, FALSE},
176     };
177 
178     for (i = 0; i < ARRAY_SIZE(rtest); i++) {
179         ret = IsRectEmpty(&rtest[i].rect);
180         ok(ret == rtest[i].ret, "Test %d: IsRectEmpty returned %s for %s\n", i,
181            ret ? "TRUE" : "FALSE", wine_dbgstr_rect(&rtest[i].rect));
182     }
183 }
184 
test_SetRect(void)185 static void test_SetRect(void)
186 {
187     RECT rect;
188     BOOL ret;
189 
190     ret = SetRect(NULL, 0, 0, 0, 0);
191     ok(!ret, "got %d\n", ret);
192 
193     ret = SetRect(&rect, 1, 2, 3, 4);
194     ok(ret, "got %d\n", ret);
195     ok(rect.left == 1 && rect.top == 2 && rect.right == 3 && rect.bottom == 4,
196         "got wrong rectangle\n");
197 
198     ret = SetRect(&rect, 10, 10, 5, 5);
199     ok(ret, "got %d\n", ret);
200     ok(rect.left == 10 && rect.top == 10 && rect.right == 5 && rect.bottom == 5,
201         "got wrong rectangle\n");
202 }
203 
START_TEST(uitools)204 START_TEST(uitools)
205 {
206     test_FillRect();
207     test_SubtractRect();
208     test_EqualRect();
209     test_IsRectEmpty();
210     test_SetRect();
211 }
212