ES_COMBO is not defined in the Windows headers. So define it if
[wine] / dlls / user / tests / edit.c
1 /* Unit test suite for edit control.
2  *
3  * Copyright 2004 Vitaliy Margolen
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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
18  */
19
20 #include <assert.h>
21 #include <windows.h>
22 #include <commctrl.h>
23
24 #include "wine/test.h"
25
26 #ifndef ES_COMBO
27 #define ES_COMBO 0x200
28 #endif
29
30
31 HWND create_editcontrol (DWORD style, DWORD exstyle)
32 {
33     HWND handle;
34
35     handle = CreateWindowEx(exstyle,
36                           "EDIT",
37                           NULL,
38                           ES_AUTOHSCROLL | ES_AUTOVSCROLL | style,
39                           10, 10, 300, 300,
40                           NULL, NULL, NULL, NULL);
41     assert (handle);
42     if (winetest_interactive)
43         ShowWindow (handle, SW_SHOW);
44     return handle;
45 }
46
47 static LONG get_edit_style (HWND hwnd)
48 {
49     return GetWindowLongA( hwnd, GWL_STYLE ) & (
50         ES_LEFT |
51 /* FIXME: not implemented
52         ES_CENTER |
53         ES_RIGHT |
54         ES_OEMCONVERT |
55 */
56         ES_MULTILINE |
57         ES_UPPERCASE |
58         ES_LOWERCASE |
59         ES_PASSWORD |
60         ES_AUTOVSCROLL |
61         ES_AUTOHSCROLL |
62         ES_NOHIDESEL |
63         ES_COMBO |
64         ES_READONLY |
65         ES_WANTRETURN |
66         ES_NUMBER
67         );
68 }
69
70 static void set_client_height(HWND Wnd, unsigned Height)
71 {
72     RECT ClientRect, WindowRect;
73
74     GetWindowRect(Wnd, &WindowRect);
75     GetClientRect(Wnd, &ClientRect);
76     SetWindowPos(Wnd, NULL, WindowRect.left, WindowRect.top,
77                  WindowRect.right - WindowRect.left,
78                  Height + (WindowRect.bottom - WindowRect.top) - (ClientRect.bottom - ClientRect.top),
79                  SWP_NOMOVE | SWP_NOZORDER);
80 }
81
82 static void test_edit_control(void)
83 {
84     HWND hwEdit;
85     MSG msMessage;
86     int i;
87     LONG r;
88     HFONT Font, OldFont;
89     HDC Dc;
90     TEXTMETRIC Metrics;
91     RECT FormatRect;
92
93     msMessage.message = WM_KEYDOWN;
94
95     trace("EDIT: Single line\n");
96     hwEdit = create_editcontrol(0, 0);
97     r = get_edit_style(hwEdit);
98     ok(r == (ES_AUTOVSCROLL | ES_AUTOHSCROLL), "Wrong style expected 0xc0 got: 0x%lx\n", r); 
99     for (i=0;i<65535;i++)
100     {
101         msMessage.wParam = i;
102         r = SendMessage(hwEdit, WM_GETDLGCODE, 0, (LPARAM) &msMessage);
103         ok(r == (DLGC_WANTCHARS | DLGC_HASSETSEL | DLGC_WANTARROWS),
104             "Expected DLGC_WANTCHARS | DLGC_HASSETSEL | DLGC_WANTARROWS got %lx\n", r);
105     }
106     DestroyWindow (hwEdit);
107
108     trace("EDIT: Single line want returns\n");
109     hwEdit = create_editcontrol(ES_WANTRETURN, 0);
110     r = get_edit_style(hwEdit);
111     ok(r == (ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_WANTRETURN), "Wrong style expected 0x10c0 got: 0x%lx\n", r); 
112     for (i=0;i<65535;i++)
113     {
114         msMessage.wParam = i;
115         r = SendMessage(hwEdit, WM_GETDLGCODE, 0, (LPARAM) &msMessage);
116         ok(r == (DLGC_WANTCHARS | DLGC_HASSETSEL | DLGC_WANTARROWS),
117             "Expected DLGC_WANTCHARS | DLGC_HASSETSEL | DLGC_WANTARROWS got %lx\n", r);
118     }
119     DestroyWindow (hwEdit);
120
121     trace("EDIT: Multiline line\n");
122     hwEdit = create_editcontrol(ES_MULTILINE | WS_VSCROLL | ES_AUTOVSCROLL, 0);
123     r = get_edit_style(hwEdit);
124     ok(r == (ES_AUTOHSCROLL | ES_AUTOVSCROLL | ES_MULTILINE), "Wrong style expected 0xc4 got: 0x%lx\n", r); 
125     for (i=0;i<65535;i++)
126     {
127         msMessage.wParam = i;
128         r = SendMessage(hwEdit, WM_GETDLGCODE, 0, (LPARAM) &msMessage);
129         ok(r == (DLGC_WANTCHARS | DLGC_HASSETSEL | DLGC_WANTALLKEYS | DLGC_WANTARROWS),
130             "Expected DLGC_WANTCHARS | DLGC_HASSETSEL | DLGC_WANTALLKEYS | DLGC_WANTARROWS got %lx\n", r);
131     }
132     DestroyWindow (hwEdit);
133
134     trace("EDIT: Multi line want returns\n");
135     hwEdit = create_editcontrol(ES_MULTILINE | WS_VSCROLL | ES_AUTOVSCROLL | ES_WANTRETURN, 0);
136     r = get_edit_style(hwEdit);
137     ok(r == (ES_WANTRETURN | ES_AUTOHSCROLL | ES_AUTOVSCROLL | ES_MULTILINE), "Wrong style expected 0x10c4 got: 0x%lx\n", r); 
138     for (i=0;i<65535;i++)
139     {
140         msMessage.wParam = i;
141         r = SendMessage(hwEdit, WM_GETDLGCODE, 0, (LPARAM) &msMessage);
142         ok(r == (DLGC_WANTCHARS | DLGC_HASSETSEL | DLGC_WANTALLKEYS | DLGC_WANTARROWS),
143             "Expected DLGC_WANTCHARS | DLGC_HASSETSEL | DLGC_WANTALLKEYS | DLGC_WANTARROWS got %lx\n", r);
144     }
145     DestroyWindow (hwEdit);
146
147     /* Get a stock font for which we can determine the metrics */
148     Font = GetStockObject(SYSTEM_FONT);
149     assert(NULL != Font);
150     Dc = GetDC(NULL);
151     assert(NULL != Dc);
152     OldFont = SelectObject(Dc, Font);
153     assert(NULL != OldFont);
154     if (! GetTextMetrics(Dc, &Metrics))
155     {
156         assert(FALSE);
157     }
158     SelectObject(Dc, OldFont);
159     ReleaseDC(NULL, Dc);
160
161     trace("EDIT: vertical text position\n");
162     hwEdit = create_editcontrol(WS_POPUP, 0);
163     SendMessage(hwEdit, WM_SETFONT, (WPARAM) Font, (LPARAM) FALSE);
164     set_client_height(hwEdit, Metrics.tmHeight - 1);
165     SendMessage(hwEdit, EM_GETRECT, 0, (LPARAM) &FormatRect);
166     ok(0 == FormatRect.top, "wrong vertical position expected 0 got %ld\n", FormatRect.top);
167     ok(Metrics.tmHeight - 1 == FormatRect.bottom - FormatRect.top, "wrong height expected %ld got %ld\n", Metrics.tmHeight - 1, FormatRect.bottom - FormatRect.top);
168     set_client_height(hwEdit, Metrics.tmHeight);
169     SendMessage(hwEdit, EM_GETRECT, 0, (LPARAM) &FormatRect);
170     ok(0 == FormatRect.top, "wrong vertical position expected 0 got %ld\n", FormatRect.top);
171     ok(Metrics.tmHeight == FormatRect.bottom - FormatRect.top, "wrong height expected %ld got %ld\n", Metrics.tmHeight, FormatRect.bottom - FormatRect.top);
172     set_client_height(hwEdit, Metrics.tmHeight + 1);
173     SendMessage(hwEdit, EM_GETRECT, 0, (LPARAM) &FormatRect);
174     ok(0 == FormatRect.top, "wrong vertical position expected 0 got %ld\n", FormatRect.top);
175     ok(Metrics.tmHeight == FormatRect.bottom - FormatRect.top, "wrong height expected %ld got %ld\n", Metrics.tmHeight, FormatRect.bottom - FormatRect.top);
176     set_client_height(hwEdit, Metrics.tmHeight + 2);
177     SendMessage(hwEdit, EM_GETRECT, 0, (LPARAM) &FormatRect);
178     ok(0 == FormatRect.top, "wrong vertical position expected 0 got %ld\n", FormatRect.top);
179     ok(Metrics.tmHeight == FormatRect.bottom - FormatRect.top, "wrong height expected %ld got %ld\n", Metrics.tmHeight, FormatRect.bottom - FormatRect.top);
180     set_client_height(hwEdit, Metrics.tmHeight + 10);
181     SendMessage(hwEdit, EM_GETRECT, 0, (LPARAM) &FormatRect);
182     ok(0 == FormatRect.top, "wrong vertical position expected 0 got %ld\n", FormatRect.top);
183     ok(Metrics.tmHeight == FormatRect.bottom - FormatRect.top, "wrong height expected %ld got %ld\n", Metrics.tmHeight, FormatRect.bottom - FormatRect.top);
184     DestroyWindow(hwEdit);
185
186     hwEdit = create_editcontrol(WS_POPUP | WS_BORDER, 0);
187     SendMessage(hwEdit, WM_SETFONT, (WPARAM) Font, (LPARAM) FALSE);
188     set_client_height(hwEdit, Metrics.tmHeight - 1);
189     SendMessage(hwEdit, EM_GETRECT, 0, (LPARAM) &FormatRect);
190     ok(0 == FormatRect.top, "wrong vertical position expected 0 got %ld\n", FormatRect.top);
191     ok(Metrics.tmHeight - 1 == FormatRect.bottom - FormatRect.top, "wrong height expected %ld got %ld\n", Metrics.tmHeight - 1, FormatRect.bottom - FormatRect.top);
192     set_client_height(hwEdit, Metrics.tmHeight);
193     SendMessage(hwEdit, EM_GETRECT, 0, (LPARAM) &FormatRect);
194     ok(0 == FormatRect.top, "wrong vertical position expected 0 got %ld\n", FormatRect.top);
195     ok(Metrics.tmHeight == FormatRect.bottom - FormatRect.top, "wrong height expected %ld got %ld\n", Metrics.tmHeight, FormatRect.bottom - FormatRect.top);
196     set_client_height(hwEdit, Metrics.tmHeight + 2);
197     SendMessage(hwEdit, EM_GETRECT, 0, (LPARAM) &FormatRect);
198     ok(0 == FormatRect.top, "wrong vertical position expected 0 got %ld\n", FormatRect.top);
199     ok(Metrics.tmHeight == FormatRect.bottom - FormatRect.top, "wrong height expected %ld got %ld\n", Metrics.tmHeight, FormatRect.bottom - FormatRect.top);
200     set_client_height(hwEdit, Metrics.tmHeight + 3);
201     SendMessage(hwEdit, EM_GETRECT, 0, (LPARAM) &FormatRect);
202     ok(0 == FormatRect.top, "wrong vertical position expected 0 got %ld\n", FormatRect.top);
203     ok(Metrics.tmHeight == FormatRect.bottom - FormatRect.top, "wrong height expected %ld got %ld\n", Metrics.tmHeight, FormatRect.bottom - FormatRect.top);
204     set_client_height(hwEdit, Metrics.tmHeight + 4);
205     SendMessage(hwEdit, EM_GETRECT, 0, (LPARAM) &FormatRect);
206     ok(2 == FormatRect.top, "wrong vertical position expected 2 got %ld\n", FormatRect.top);
207     ok(Metrics.tmHeight == FormatRect.bottom - FormatRect.top, "wrong height expected %ld got %ld\n", Metrics.tmHeight, FormatRect.bottom - FormatRect.top);
208     set_client_height(hwEdit, Metrics.tmHeight + 10);
209     SendMessage(hwEdit, EM_GETRECT, 0, (LPARAM) &FormatRect);
210     ok(2 == FormatRect.top, "wrong vertical position expected 0 got %ld\n", FormatRect.top);
211     ok(Metrics.tmHeight == FormatRect.bottom - FormatRect.top, "wrong height expected %ld got %ld\n", Metrics.tmHeight, FormatRect.bottom - FormatRect.top);
212     DestroyWindow(hwEdit);
213
214     hwEdit = create_editcontrol(WS_POPUP, WS_EX_CLIENTEDGE);
215     SendMessage(hwEdit, WM_SETFONT, (WPARAM) Font, (LPARAM) FALSE);
216     set_client_height(hwEdit, Metrics.tmHeight - 1);
217     SendMessage(hwEdit, EM_GETRECT, 0, (LPARAM) &FormatRect);
218     ok(0 == FormatRect.top, "wrong vertical position expected 0 got %ld\n", FormatRect.top);
219     ok(Metrics.tmHeight - 1 == FormatRect.bottom - FormatRect.top, "wrong height expected %ld got %ld\n", Metrics.tmHeight - 1, FormatRect.bottom - FormatRect.top);
220     set_client_height(hwEdit, Metrics.tmHeight);
221     SendMessage(hwEdit, EM_GETRECT, 0, (LPARAM) &FormatRect);
222     ok(0 == FormatRect.top, "wrong vertical position expected 0 got %ld\n", FormatRect.top);
223     ok(Metrics.tmHeight == FormatRect.bottom - FormatRect.top, "wrong height expected %ld got %ld\n", Metrics.tmHeight, FormatRect.bottom - FormatRect.top);
224     set_client_height(hwEdit, Metrics.tmHeight + 1);
225     SendMessage(hwEdit, EM_GETRECT, 0, (LPARAM) &FormatRect);
226     ok(0 == FormatRect.top, "wrong vertical position expected 0 got %ld\n", FormatRect.top);
227     ok(Metrics.tmHeight == FormatRect.bottom - FormatRect.top, "wrong height expected %ld got %ld\n", Metrics.tmHeight, FormatRect.bottom - FormatRect.top);
228     set_client_height(hwEdit, Metrics.tmHeight + 2);
229     SendMessage(hwEdit, EM_GETRECT, 0, (LPARAM) &FormatRect);
230     ok(1 == FormatRect.top, "wrong vertical position expected 1 got %ld\n", FormatRect.top);
231     ok(Metrics.tmHeight == FormatRect.bottom - FormatRect.top, "wrong height expected %ld got %ld\n", Metrics.tmHeight, FormatRect.bottom - FormatRect.top);
232     set_client_height(hwEdit, Metrics.tmHeight + 4);
233     SendMessage(hwEdit, EM_GETRECT, 0, (LPARAM) &FormatRect);
234     ok(1 == FormatRect.top, "wrong vertical position expected 1 got %ld\n", FormatRect.top);
235     ok(Metrics.tmHeight == FormatRect.bottom - FormatRect.top, "wrong height expected %ld got %ld\n", Metrics.tmHeight, FormatRect.bottom - FormatRect.top);
236     set_client_height(hwEdit, Metrics.tmHeight + 10);
237     SendMessage(hwEdit, EM_GETRECT, 0, (LPARAM) &FormatRect);
238     ok(1 == FormatRect.top, "wrong vertical position expected 1 got %ld\n", FormatRect.top);
239     ok(Metrics.tmHeight == FormatRect.bottom - FormatRect.top, "wrong height expected %ld got %ld\n", Metrics.tmHeight, FormatRect.bottom - FormatRect.top);
240     DestroyWindow(hwEdit);
241
242     hwEdit = create_editcontrol(WS_POPUP | WS_BORDER, WS_EX_CLIENTEDGE);
243     SendMessage(hwEdit, WM_SETFONT, (WPARAM) Font, (LPARAM) FALSE);
244     set_client_height(hwEdit, Metrics.tmHeight - 1);
245     SendMessage(hwEdit, EM_GETRECT, 0, (LPARAM) &FormatRect);
246     ok(0 == FormatRect.top, "wrong vertical position expected 0 got %ld\n", FormatRect.top);
247     ok(Metrics.tmHeight - 1 == FormatRect.bottom - FormatRect.top, "wrong height expected %ld got %ld\n", Metrics.tmHeight - 1, FormatRect.bottom - FormatRect.top);
248     set_client_height(hwEdit, Metrics.tmHeight);
249     SendMessage(hwEdit, EM_GETRECT, 0, (LPARAM) &FormatRect);
250     ok(0 == FormatRect.top, "wrong vertical position expected 0 got %ld\n", FormatRect.top);
251     ok(Metrics.tmHeight == FormatRect.bottom - FormatRect.top, "wrong height expected %ld got %ld\n", Metrics.tmHeight, FormatRect.bottom - FormatRect.top);
252     set_client_height(hwEdit, Metrics.tmHeight + 1);
253     SendMessage(hwEdit, EM_GETRECT, 0, (LPARAM) &FormatRect);
254     ok(0 == FormatRect.top, "wrong vertical position expected 0 got %ld\n", FormatRect.top);
255     ok(Metrics.tmHeight == FormatRect.bottom - FormatRect.top, "wrong height expected %ld got %ld\n", Metrics.tmHeight, FormatRect.bottom - FormatRect.top);
256     set_client_height(hwEdit, Metrics.tmHeight + 2);
257     SendMessage(hwEdit, EM_GETRECT, 0, (LPARAM) &FormatRect);
258     ok(1 == FormatRect.top, "wrong vertical position expected 1 got %ld\n", FormatRect.top);
259     ok(Metrics.tmHeight == FormatRect.bottom - FormatRect.top, "wrong height expected %ld got %ld\n", Metrics.tmHeight, FormatRect.bottom - FormatRect.top);
260     set_client_height(hwEdit, Metrics.tmHeight + 4);
261     SendMessage(hwEdit, EM_GETRECT, 0, (LPARAM) &FormatRect);
262     ok(1 == FormatRect.top, "wrong vertical position expected 1 got %ld\n", FormatRect.top);
263     ok(Metrics.tmHeight == FormatRect.bottom - FormatRect.top, "wrong height expected %ld got %ld\n", Metrics.tmHeight, FormatRect.bottom - FormatRect.top);
264     set_client_height(hwEdit, Metrics.tmHeight + 10);
265     SendMessage(hwEdit, EM_GETRECT, 0, (LPARAM) &FormatRect);
266     ok(1 == FormatRect.top, "wrong vertical position expected 1 got %ld\n", FormatRect.top);
267     ok(Metrics.tmHeight == FormatRect.bottom - FormatRect.top, "wrong height expected %ld got %ld\n", Metrics.tmHeight, FormatRect.bottom - FormatRect.top);
268     DestroyWindow(hwEdit);
269 }
270
271 START_TEST(edit)
272 {
273     test_edit_control();
274 }