1 /* Unit tests for the track bar control.
2  *
3  * Copyright 2007 Keith Stevens
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 #include <windows.h>
21 #include <commctrl.h>
22 #include <stdio.h>
23 
24 #include "wine/test.h"
25 #include "msg.h"
26 #include "v6util.h"
27 
28 #define expect(expected, got) ok(got == expected, "Expected %d, got %d\n", expected, got)
29 #define NUM_MSG_SEQUENCE 2
30 #define PARENT_SEQ_INDEX 0
31 #define TRACKBAR_SEQ_INDEX 1
32 
33 static const DWORD defaultstyle = WS_VISIBLE | TBS_TOOLTIPS | TBS_ENABLESELRANGE | TBS_FIXEDLENGTH | TBS_AUTOTICKS;
34 static HWND hWndParent;
35 
36 static LRESULT WINAPI trackbar_no_wmpaint_proc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
37 {
38     WNDPROC oldproc = (WNDPROC)GetWindowLongPtrA(hwnd, GWLP_USERDATA);
39 
40     if (message == WM_PAINT)
41         return 0;
42 
43     return CallWindowProcA(oldproc, hwnd, message, wParam, lParam);
44 }
45 
46 static struct msg_sequence *sequences[NUM_MSG_SEQUENCE];
47 
48 static const struct message empty_seq[] = {
49     {0}
50 };
51 
52 static const struct message parent_create_trackbar_wnd_seq[] = {
53     { WM_NOTIFYFORMAT, sent},
54     { WM_QUERYUISTATE, sent|optional},
55     { WM_WINDOWPOSCHANGING, sent},
56     { WM_NCACTIVATE, sent},
57     { PBT_APMRESUMECRITICAL, sent},
58     { WM_WINDOWPOSCHANGING, sent},
59     { PBT_APMRESUMESTANDBY, sent},
60     { WM_IME_SETCONTEXT, sent|optional},
61     { WM_IME_NOTIFY, sent|optional},
62     { WM_CTLCOLORSTATIC, sent},
63     { WM_NOTIFY, sent},
64     {0}
65 };
66 
67 static const struct message parent_new_window_test_seq[] = {
68     { WM_QUERYNEWPALETTE, sent|optional },
69     { WM_WINDOWPOSCHANGING, sent|optional},
70     { WM_NCACTIVATE, sent|optional},
71     { PBT_APMRESUMECRITICAL, sent|optional},
72     { WM_IME_SETCONTEXT, sent|defwinproc|optional},
73     { WM_IME_NOTIFY, sent|defwinproc|optional},
74     { WM_SETFOCUS, sent|defwinproc|optional},
75     { WM_NOTIFYFORMAT, sent},
76     { WM_QUERYUISTATE, sent|optional},
77     {0}
78 };
79 
80 static const struct message buddy_window_test_seq[] = {
81     { TBM_GETBUDDY, sent|wparam, TRUE},
82     { TBM_SETBUDDY, sent|wparam, FALSE},
83     { WM_PAINT, sent|defwinproc},
84     { TBM_SETBUDDY, sent|wparam, FALSE},
85     { WM_PAINT, sent|defwinproc},
86     { TBM_GETBUDDY, sent|wparam, TRUE},
87     { TBM_SETBUDDY, sent|wparam, TRUE},
88     { WM_PAINT, sent|defwinproc},
89     { TBM_SETBUDDY, sent|wparam, TRUE},
90     { WM_PAINT, sent|defwinproc},
91     { TBM_GETBUDDY, sent|wparam, FALSE},
92     { TBM_GETBUDDY, sent|wparam, TRUE},
93     {0}
94 };
95 
96 static const struct message parent_buddy_window_test_seq[] = {
97     { WM_CTLCOLORSTATIC, sent},
98     { WM_NOTIFY, sent},
99     { WM_CTLCOLORSTATIC, sent},
100     { WM_NOTIFY, sent},
101     { WM_CTLCOLORSTATIC, sent},
102     { WM_NOTIFY, sent},
103     { WM_CTLCOLORSTATIC, sent},
104     { WM_NOTIFY, sent},
105     {0}
106 };
107 
108 static const struct message line_size_test_seq[] = {
109     { TBM_SETLINESIZE, sent|lparam, 0, 10},
110     { TBM_SETLINESIZE, sent|lparam, 0, 4},
111     { TBM_GETLINESIZE, sent},
112     {0}
113 };
114 
115 static const struct message page_size_test_seq[] = {
116     { TBM_SETPAGESIZE, sent|lparam, 0, 10},
117     { TBM_SETPAGESIZE, sent|lparam, 0, -1},
118     { TBM_GETPAGESIZE, sent},
119     {0}
120 };
121 
122 static const struct message position_test_seq[] = {
123     { TBM_SETPOS, sent|wparam|lparam, TRUE, -1},
124     { WM_PAINT, sent|defwinproc},
125     { TBM_GETPOS, sent},
126     { TBM_SETPOS, sent|wparam|lparam, TRUE, 5},
127     { WM_PAINT, sent|defwinproc},
128     { TBM_GETPOS, sent},
129     { TBM_SETPOS, sent|wparam|lparam, TRUE, 5},
130     { TBM_SETPOS, sent|wparam|lparam, TRUE, 1000},
131     { WM_PAINT, sent|defwinproc},
132     { TBM_GETPOS, sent},
133     { TBM_SETPOS, sent|wparam|lparam, FALSE, 20},
134     { TBM_GETPOS, sent},
135     { TBM_SETPOS, sent|wparam|lparam, TRUE, 20},
136     { TBM_GETPOS, sent},
137     {0}
138 };
139 
140 static const struct message parent_position_test_seq[] = {
141     { WM_CTLCOLORSTATIC, sent},
142     { WM_NOTIFY, sent},
143     { WM_CTLCOLORSTATIC, sent},
144     { WM_NOTIFY, sent},
145     { WM_CTLCOLORSTATIC, sent},
146     { WM_NOTIFY, sent},
147     {0}
148 };
149 
150 static const struct message range_test_seq[] = {
151     { TBM_SETRANGE, sent|wparam|lparam, TRUE, MAKELONG(0, 10)},
152     { WM_PAINT, sent|defwinproc},
153     { TBM_GETRANGEMAX, sent},
154     { TBM_GETRANGEMIN, sent},
155     { TBM_SETRANGE, sent|wparam|lparam, TRUE, MAKELONG(-1, 1000)},
156     { WM_PAINT, sent|defwinproc},
157     { TBM_GETRANGEMAX, sent},
158     { TBM_GETRANGEMIN, sent},
159     { TBM_SETRANGE, sent|wparam|lparam, TRUE, MAKELONG(10, 0)},
160     { WM_PAINT, sent|defwinproc},
161     { TBM_GETRANGEMAX, sent},
162     { TBM_GETRANGEMIN, sent},
163     { TBM_SETRANGE, sent|wparam|lparam, FALSE, MAKELONG(0, 10)},
164     { TBM_GETRANGEMAX, sent},
165     { TBM_GETRANGEMIN, sent},
166     { TBM_SETRANGEMAX, sent|wparam|lparam, TRUE, 10},
167     { WM_PAINT, sent|defwinproc},
168     { TBM_GETRANGEMAX, sent},
169     { TBM_SETRANGEMAX, sent|wparam|lparam, TRUE, -1},
170     { WM_PAINT, sent|defwinproc},
171     { TBM_GETRANGEMAX, sent},
172     { TBM_SETRANGEMAX, sent|wparam|lparam, FALSE, 10},
173     { TBM_GETRANGEMAX, sent},
174     { TBM_SETRANGEMIN, sent|wparam|lparam, TRUE, 0},
175     { WM_PAINT, sent|defwinproc},
176     { TBM_GETRANGEMIN, sent},
177     { TBM_SETRANGEMIN, sent|wparam|lparam, TRUE, 10},
178     { WM_PAINT, sent|defwinproc},
179     { TBM_GETRANGEMIN, sent},
180     { TBM_SETRANGEMIN, sent|wparam|lparam, TRUE, -10},
181     { WM_PAINT, sent|defwinproc},
182     { TBM_GETRANGEMIN, sent},
183     { TBM_SETRANGEMIN, sent|wparam|lparam, FALSE, 5},
184     { TBM_GETRANGEMIN, sent},
185     { TBM_GETRANGEMAX, sent},
186     { TBM_GETRANGEMIN, sent},
187     {0}
188 };
189 
190 static const struct message parent_range_test_seq[] = {
191     { WM_CTLCOLORSTATIC, sent},
192     { WM_NOTIFY, sent},
193     { WM_CTLCOLORSTATIC, sent},
194     { WM_NOTIFY, sent},
195     { WM_CTLCOLORSTATIC, sent},
196     { WM_NOTIFY, sent},
197     { WM_CTLCOLORSTATIC, sent},
198     { WM_NOTIFY, sent},
199     { WM_CTLCOLORSTATIC, sent},
200     { WM_NOTIFY, sent},
201     { WM_CTLCOLORSTATIC, sent},
202     { WM_NOTIFY, sent},
203     { WM_CTLCOLORSTATIC, sent},
204     { WM_NOTIFY, sent},
205     { WM_CTLCOLORSTATIC, sent},
206     { WM_NOTIFY, sent},
207     {0}
208 };
209 
210 static const struct message selection_test_seq[] = {
211     { TBM_SETSEL, sent|wparam|lparam, TRUE, MAKELONG(0, 10)},
212     { WM_PAINT, sent|defwinproc},
213     { TBM_GETSELEND, sent},
214     { TBM_GETSELSTART, sent},
215     { TBM_SETSEL, sent|wparam|lparam, TRUE, MAKELONG(5, 20)},
216     { WM_PAINT, sent|defwinproc},
217     { TBM_GETSELEND, sent},
218     { TBM_GETSELSTART, sent},
219     { TBM_SETSEL, sent|wparam|lparam, FALSE, MAKELONG(5, 10)},
220     { TBM_GETSELEND, sent},
221     { TBM_GETSELSTART, sent},
222     { TBM_SETSELEND, sent|wparam|lparam, TRUE, 10},
223     { WM_PAINT, sent|defwinproc},
224     { TBM_GETSELEND, sent},
225     { TBM_SETSELEND, sent|wparam|lparam, TRUE, 20},
226     { WM_PAINT, sent|defwinproc},
227     { TBM_GETSELEND, sent},
228     { TBM_SETSELEND, sent|wparam|lparam, TRUE, 4},
229     { WM_PAINT, sent|defwinproc},
230     { TBM_GETSELEND, sent},
231     { TBM_SETSELEND, sent|wparam|lparam, FALSE, 2},
232     { TBM_GETSELEND, sent},
233     { TBM_GETSELEND, sent},
234     { TBM_SETSELSTART, sent|wparam|lparam, TRUE, 5},
235     { WM_PAINT, sent|defwinproc},
236     { TBM_GETSELSTART, sent},
237     { TBM_SETSELSTART, sent|wparam|lparam, TRUE, 0},
238     { WM_PAINT, sent|defwinproc},
239     { TBM_GETSELSTART, sent},
240     { TBM_SETSELSTART, sent|wparam|lparam, TRUE, 20},
241     { WM_PAINT, sent|defwinproc},
242     { TBM_GETSELSTART, sent},
243     { TBM_SETSELSTART, sent|wparam|lparam, FALSE, 8},
244     { TBM_GETSELSTART, sent},
245     { TBM_GETSELSTART, sent},
246     {0}
247 };
248 
249 static const struct message parent_selection_test_seq[] = {
250     { WM_CTLCOLORSTATIC, sent},
251     { WM_NOTIFY, sent},
252     { WM_CTLCOLORSTATIC, sent},
253     { WM_NOTIFY, sent},
254     { WM_CTLCOLORSTATIC, sent},
255     { WM_NOTIFY, sent},
256     { WM_CTLCOLORSTATIC, sent},
257     { WM_NOTIFY, sent},
258     { WM_CTLCOLORSTATIC, sent},
259     { WM_NOTIFY, sent},
260     { WM_CTLCOLORSTATIC, sent},
261     { WM_NOTIFY, sent},
262     { WM_CTLCOLORSTATIC, sent},
263     { WM_NOTIFY, sent},
264     { WM_CTLCOLORSTATIC, sent},
265     { WM_NOTIFY, sent},
266     {0}
267 };
268 
269 static const struct message tic_settings_test_seq[] = {
270     { TBM_SETTIC, sent|lparam, 0, 0},
271     { TBM_SETTIC, sent|lparam, 0, 5},
272     { TBM_SETTIC, sent|lparam, 0, 10},
273     { TBM_SETTIC, sent|lparam, 0, 20},
274     { TBM_SETRANGE, sent|wparam|lparam, TRUE, MAKELONG(0,10)},
275     { WM_PAINT, sent|defwinproc},
276     { TBM_SETTICFREQ, sent|wparam, 2},
277     { WM_PAINT, sent|defwinproc},
278     { TBM_GETNUMTICS, sent},
279     { TBM_SETTICFREQ, sent|wparam, 5},
280     { WM_PAINT, sent|defwinproc},
281     { TBM_GETNUMTICS, sent},
282     { TBM_SETTICFREQ, sent|wparam, 15},
283     { WM_PAINT, sent|defwinproc},
284     { TBM_GETNUMTICS, sent},
285     { TBM_GETNUMTICS, sent},
286     {0}
287 };
288 
289 static const struct message parent_tic_settings_test_seq[] = {
290     { WM_CTLCOLORSTATIC, sent},
291     { WM_NOTIFY, sent},
292     { WM_CTLCOLORSTATIC, sent},
293     { WM_NOTIFY, sent},
294     { WM_CTLCOLORSTATIC, sent},
295     { WM_NOTIFY, sent},
296     { WM_CTLCOLORSTATIC, sent},
297     { WM_NOTIFY, sent},
298     {0}
299 };
300 
301 static const struct message thumb_length_test_seq[] = {
302     { TBM_SETTHUMBLENGTH, sent|wparam|lparam, 15, 0},
303     { WM_PAINT, sent|defwinproc},
304     { TBM_GETTHUMBLENGTH, sent},
305     { TBM_SETTHUMBLENGTH, sent|wparam|lparam, 20, 0},
306     { WM_PAINT, sent|defwinproc},
307     { TBM_GETTHUMBLENGTH, sent},
308     { TBM_GETTHUMBLENGTH, sent},
309     { WM_SIZE, sent},
310     { WM_PAINT, sent|defwinproc},
311     { TBM_GETTHUMBLENGTH, sent},
312     { WM_SIZE, sent},
313     { WM_PAINT, sent|defwinproc},
314     { TBM_GETTHUMBLENGTH, sent},
315     {0}
316 };
317 
318 static const struct message parent_thumb_length_test_seq[] = {
319     { WM_CTLCOLORSTATIC, sent},
320     { WM_NOTIFY, sent},
321     { WM_CTLCOLORSTATIC, sent},
322     { WM_NOTIFY, sent},
323     { WM_CTLCOLORSTATIC, sent},
324     { WM_NOTIFY, sent},
325     { WM_CTLCOLORSTATIC, sent},
326     { WM_NOTIFY, sent},
327     {0}
328 };
329 
330 static const struct message tic_placement_test_seq[] = {
331     { TBM_GETPTICS, sent},
332     { TBM_GETTIC, sent|wparam, 0},
333     { TBM_GETTIC, sent|wparam, 2},
334     { TBM_GETTIC, sent|wparam, 4},
335     { TBM_GETTICPOS, sent|wparam, 0},
336     { TBM_GETTICPOS, sent|wparam, 2},
337     {0}
338 };
339 
340 static const struct message tool_tips_test_seq[] = {
341     { TBM_SETTIPSIDE, sent|wparam, TBTS_TOP},
342     { TBM_SETTIPSIDE, sent|wparam, TBTS_LEFT},
343     { TBM_SETTIPSIDE, sent|wparam, TBTS_BOTTOM},
344     { TBM_SETTIPSIDE, sent|wparam, TBTS_RIGHT},
345     { TBM_SETTOOLTIPS, sent},
346     { TBM_GETTOOLTIPS, sent},
347     { TBM_SETTOOLTIPS, sent},
348     { TBM_GETTOOLTIPS, sent},
349     { TBM_SETTOOLTIPS, sent},
350     { TBM_GETTOOLTIPS, sent},
351     { TBM_GETTOOLTIPS, sent},
352     {0}
353 };
354 
355 static const struct message unicode_test_seq[] = {
356     { TBM_SETUNICODEFORMAT, sent|wparam, TRUE},
357     { TBM_SETUNICODEFORMAT, sent|wparam, FALSE},
358     { TBM_GETUNICODEFORMAT, sent},
359     {0}
360 };
361 
362 static const struct message ignore_selection_test_seq[] = {
363     { TBM_SETSEL, sent|wparam|lparam, TRUE, MAKELONG(0,10)},
364     { TBM_GETSELEND, sent},
365     { TBM_GETSELSTART, sent},
366     { TBM_SETSEL, sent|wparam|lparam, FALSE, MAKELONG(0,10)},
367     { TBM_GETSELEND, sent},
368     { TBM_GETSELSTART, sent},
369     { TBM_SETSELEND, sent|wparam|lparam, TRUE,0},
370     { TBM_GETSELEND, sent},
371     { TBM_SETSELEND, sent|wparam|lparam, TRUE, 10},
372     { TBM_GETSELEND, sent},
373     { TBM_SETSELEND, sent|wparam|lparam, FALSE,0},
374     { TBM_GETSELEND, sent},
375     { TBM_SETSELSTART, sent|wparam|lparam, TRUE,0},
376     { TBM_GETSELSTART, sent},
377     { TBM_SETSELSTART, sent|wparam|lparam, TRUE, 10},
378     { TBM_GETSELSTART, sent},
379     { TBM_SETSELSTART, sent|wparam|lparam, FALSE,0},
380     { TBM_GETSELSTART, sent},
381     {0}
382 };
383 
384 static LRESULT WINAPI parent_wnd_proc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){
385     static LONG defwndproc_counter = 0;
386     LRESULT ret;
387     struct message msg;
388 
389     /* log system messages, except for painting */
390     if (message < WM_USER &&
391         message != WM_PAINT &&
392         message != WM_ERASEBKGND &&
393         message != WM_NCPAINT &&
394         message != WM_NCHITTEST &&
395         message != WM_GETTEXT &&
396         message != WM_GETICON &&
397         message != WM_DEVICECHANGE)
398     {
399         msg.message = message;
400         msg.flags = sent|wparam|lparam;
401         if (defwndproc_counter) msg.flags |= defwinproc;
402         msg.wParam = wParam;
403         msg.lParam = lParam;
404         msg.id = 0;
405         add_message(sequences, PARENT_SEQ_INDEX, &msg);
406     }
407 
408     defwndproc_counter++;
409     ret = DefWindowProcA(hwnd, message, wParam, lParam);
410     defwndproc_counter--;
411 
412     return ret;
413 }
414 
415 static BOOL register_parent_wnd_class(void){
416     WNDCLASSA cls;
417 
418     cls.style = 0;
419     cls.lpfnWndProc = parent_wnd_proc;
420     cls.cbClsExtra = 0;
421     cls.cbWndExtra = 0;
422     cls.hInstance = GetModuleHandleA(NULL);
423     cls.hIcon = 0;
424     cls.hCursor = LoadCursorA(0, (LPCSTR)IDC_ARROW);
425     cls.hbrBackground = GetStockObject(WHITE_BRUSH);
426     cls.lpszMenuName = NULL;
427     cls.lpszClassName = "Trackbar test parent class";
428     return RegisterClassA(&cls);
429 }
430 
431 static HWND create_parent_window(void){
432     if (!register_parent_wnd_class())
433         return NULL;
434 
435     return CreateWindowA("Trackbar test parent class", "Trackbar test parent window",
436                          WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_VISIBLE,
437                          0, 0, 100, 100, GetDesktopWindow(), NULL, GetModuleHandleA(NULL), NULL);
438 }
439 
440 static LRESULT WINAPI trackbar_subclass_proc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){
441     WNDPROC oldproc = (WNDPROC)GetWindowLongPtrA(hwnd, GWLP_USERDATA);
442     static LONG defwndproc_counter = 0;
443     struct message msg = { 0 };
444     LRESULT ret;
445 
446     msg.message = message;
447     msg.flags = sent|wparam|lparam;
448     if (defwndproc_counter) msg.flags |= defwinproc;
449     msg.wParam = wParam;
450     msg.lParam = lParam;
451     add_message(sequences, TRACKBAR_SEQ_INDEX, &msg);
452 
453     defwndproc_counter++;
454     ret = CallWindowProcA(oldproc, hwnd, message, wParam, lParam);
455     defwndproc_counter--;
456 
457     return ret;
458 }
459 
460 static HWND create_trackbar(DWORD style, HWND parent){
461     HWND hWndTrack;
462     WNDPROC oldproc;
463     RECT rect;
464 
465     GetClientRect(parent, &rect);
466     hWndTrack = CreateWindowA(TRACKBAR_CLASSA, "Trackbar Control", style,
467                               rect.right, rect.bottom, 100, 50,
468                               parent, NULL, GetModuleHandleA(NULL), NULL);
469 
470     if (!hWndTrack) return NULL;
471 
472     oldproc = (WNDPROC)SetWindowLongPtrA(hWndTrack, GWLP_WNDPROC, (LONG_PTR)trackbar_subclass_proc);
473     SetWindowLongPtrA(hWndTrack, GWLP_USERDATA, (LONG_PTR)oldproc);
474 
475     return hWndTrack;
476 }
477 
478 static HWND create_trackbar2(DWORD style, HWND parent)
479 {
480     RECT rect;
481     GetClientRect(parent, &rect);
482     return CreateWindowA(TRACKBAR_CLASSA, "Trackbar Control", style,
483                               rect.right, rect.bottom, 100, 50,
484                               parent, NULL, GetModuleHandleA(NULL), NULL);
485 }
486 
487 /* test functions for setters, getters, and sequences */
488 
489 static void test_trackbar_buddy(void)
490 {
491     HWND hWndLeftBuddy, hWndTrackbar;
492     HWND hWndRightBuddy;
493     HWND hWndCurrentBuddy;
494     HWND rTest;
495 
496     hWndTrackbar = create_trackbar(defaultstyle, hWndParent);
497     ok(hWndTrackbar != NULL, "Expected non NULL value\n");
498 
499     flush_sequences(sequences, NUM_MSG_SEQUENCE);
500 
501     hWndLeftBuddy = CreateWindowA(STATUSCLASSNAMEA, NULL, 0, 0, 0, 300, 20, NULL, NULL, NULL, NULL);
502     ok(hWndLeftBuddy != NULL, "Expected non NULL value\n");
503 
504     if (hWndLeftBuddy != NULL){
505         hWndCurrentBuddy = (HWND) SendMessageA(hWndTrackbar, TBM_GETBUDDY, TRUE, 0);
506         rTest = (HWND) SendMessageA(hWndTrackbar, TBM_SETBUDDY, FALSE, (LPARAM) hWndLeftBuddy);
507         ok(rTest == hWndCurrentBuddy, "Expected hWndCurrentBuddy\n");
508         rTest = (HWND) SendMessageA(hWndTrackbar, TBM_SETBUDDY, FALSE, (LPARAM) hWndLeftBuddy);
509         ok(rTest == hWndLeftBuddy, "Expected hWndLeftBuddy\n");
510     } else
511         skip ("left buddy control not present?\n");
512 
513     hWndRightBuddy = CreateWindowA(STATUSCLASSNAMEA, NULL, 0, 0, 0, 300, 20, NULL, NULL, NULL, NULL);
514 
515     ok(hWndRightBuddy != NULL, "expected non NULL value\n");
516 
517     /* test TBM_SETBUDDY */
518     if (hWndRightBuddy != NULL){
519         hWndCurrentBuddy = (HWND) SendMessageA(hWndTrackbar, TBM_GETBUDDY, TRUE, 0);
520         rTest = (HWND) SendMessageA(hWndTrackbar, TBM_SETBUDDY, TRUE, (LPARAM) hWndRightBuddy);
521         ok(rTest == hWndCurrentBuddy, "Expected hWndCurrentBuddy\n");
522         rTest = (HWND) SendMessageA(hWndTrackbar, TBM_SETBUDDY, TRUE, (LPARAM) hWndRightBuddy);
523         ok(rTest == hWndRightBuddy, "Expected hWndRightbuddy\n");
524      } else
525        skip("Right buddy control not present?\n");
526 
527     /* test TBM_GETBUDDY */
528     if (hWndLeftBuddy != NULL){
529         rTest = (HWND) SendMessageA(hWndTrackbar, TBM_GETBUDDY, FALSE, 0);
530         ok(rTest == hWndLeftBuddy, "Expected hWndLeftBuddy\n");
531         DestroyWindow(hWndLeftBuddy);
532     }
533     if (hWndRightBuddy != NULL){
534         rTest = (HWND) SendMessageA(hWndTrackbar, TBM_GETBUDDY, TRUE,0);
535         ok(rTest == hWndRightBuddy, "Expected hWndRightBuddy\n");
536         DestroyWindow(hWndRightBuddy);
537     }
538 
539     ok_sequence(sequences, TRACKBAR_SEQ_INDEX, buddy_window_test_seq, "buddy test sequence", TRUE);
540     ok_sequence(sequences, PARENT_SEQ_INDEX, parent_buddy_window_test_seq, "parent buddy test seq", TRUE);
541 
542     DestroyWindow(hWndTrackbar);
543 }
544 
545 static void test_line_size(void)
546 {
547     HWND hWndTrackbar;
548     int r;
549 
550     hWndTrackbar = create_trackbar(defaultstyle, hWndParent);
551     ok(hWndTrackbar != NULL, "Expected non NULL value\n");
552 
553     flush_sequences(sequences, NUM_MSG_SEQUENCE);
554 
555     /* test TBM_SETLINESIZE */
556     r = SendMessageA(hWndTrackbar, TBM_SETLINESIZE, 0, 10);
557     expect(1,r);
558     r = SendMessageA(hWndTrackbar, TBM_SETLINESIZE, 0, 4);
559     expect(10, r);
560 
561     /* test TBM_GETLINESIZE */
562     r = SendMessageA(hWndTrackbar, TBM_GETLINESIZE, 0,0);
563     expect(4, r);
564 
565     ok_sequence(sequences, TRACKBAR_SEQ_INDEX, line_size_test_seq, "linesize test sequence", FALSE);
566     ok_sequence(sequences, PARENT_SEQ_INDEX, empty_seq, "parent line test sequence", FALSE);
567 
568     DestroyWindow(hWndTrackbar);
569 }
570 
571 
572 static void test_page_size(void)
573 {
574     HWND hWndTrackbar;
575     int r;
576 
577     hWndTrackbar = create_trackbar(defaultstyle, hWndParent);
578     ok(hWndTrackbar != NULL, "Expected non NULL value\n");
579 
580     r = SendMessageA(hWndTrackbar, TBM_GETPAGESIZE, 0, 0);
581     ok(r == 20, "Unexpected page size %d.\n", r);
582 
583     SendMessageA(hWndTrackbar, TBM_SETRANGE, 0, MAKELPARAM(0, 65));
584 
585     r = SendMessageA(hWndTrackbar, TBM_GETPAGESIZE, 0, 0);
586     ok(r == 13, "Unexpected page size %d.\n", r);
587 
588     SendMessageA(hWndTrackbar, TBM_SETRANGEMIN, 0, 10);
589 
590     r = SendMessageA(hWndTrackbar, TBM_GETPAGESIZE, 0, 0);
591     ok(r == 11, "Unexpected page size %d.\n", r);
592 
593     SendMessageA(hWndTrackbar, TBM_SETRANGEMAX, 0, 50);
594 
595     r = SendMessageA(hWndTrackbar, TBM_GETPAGESIZE, 0, 0);
596     ok(r == 8, "Unexpected page size %d.\n", r);
597 
598     r = SendMessageA(hWndTrackbar, TBM_SETPAGESIZE, 0, 10);
599     ok(r == 8, "Unexpected page size %d.\n", r);
600 
601     SendMessageA(hWndTrackbar, TBM_SETRANGE, 0, MAKELPARAM(0, 30));
602 
603     r = SendMessageA(hWndTrackbar, TBM_GETPAGESIZE, 0, 0);
604     ok(r == 10, "Unexpected page size %d.\n", r);
605 
606     SendMessageA(hWndTrackbar, TBM_SETRANGEMIN, 0, 5);
607 
608     r = SendMessageA(hWndTrackbar, TBM_GETPAGESIZE, 0, 0);
609     ok(r == 10, "Unexpected page size %d.\n", r);
610 
611     SendMessageA(hWndTrackbar, TBM_SETRANGEMAX, 0, 40);
612 
613     r = SendMessageA(hWndTrackbar, TBM_GETPAGESIZE, 0, 0);
614     ok(r == 10, "Unexpected page size %d.\n", r);
615 
616     r = SendMessageA(hWndTrackbar, TBM_SETPAGESIZE, 0, -1);
617     ok(r == 10, "Unexpected page size %d.\n", r);
618 
619     r = SendMessageA(hWndTrackbar, TBM_GETPAGESIZE, 0, 0);
620     ok(r == 7, "Unexpected page size %d.\n", r);
621 
622     SendMessageA(hWndTrackbar, TBM_SETRANGEMAX, 0, 100);
623 
624     r = SendMessageA(hWndTrackbar, TBM_GETPAGESIZE, 0, 0);
625     ok(r == 19, "Unexpected page size %d.\n", r);
626 
627     DestroyWindow(hWndTrackbar);
628 
629     hWndTrackbar = create_trackbar(defaultstyle, hWndParent);
630     ok(hWndTrackbar != NULL, "Failed to create trackbar window.\n");
631 
632     flush_sequences(sequences, NUM_MSG_SEQUENCE);
633 
634     /* test TBM_SETPAGESIZE */
635     r = SendMessageA(hWndTrackbar, TBM_SETPAGESIZE, 0, 10);
636     expect(20, r);
637     r = SendMessageA(hWndTrackbar, TBM_SETPAGESIZE, 0, -1);
638     expect(10, r);
639 
640     /* test TBM_GETPAGESIZE */
641     r = SendMessageA(hWndTrackbar, TBM_GETPAGESIZE, 0,0);
642     expect(20, r);
643 
644     ok_sequence(sequences, TRACKBAR_SEQ_INDEX, page_size_test_seq, "page size test sequence", FALSE);
645     ok_sequence(sequences, PARENT_SEQ_INDEX, empty_seq, "parent page size test sequence", FALSE);
646 
647     /* check for zero page size */
648     r = SendMessageA(hWndTrackbar, TBM_SETPAGESIZE, 0, 0);
649     expect(20, r);
650     r = SendMessageA(hWndTrackbar, TBM_GETPAGESIZE, 0, 0);
651     expect(0, r);
652     /* revert to default */
653     r = SendMessageA(hWndTrackbar, TBM_SETPAGESIZE, 0, -1);
654     expect(0, r);
655     r = SendMessageA(hWndTrackbar, TBM_GETPAGESIZE, 0, 0);
656     expect(20, r);
657     /* < -1 */
658     r = SendMessageA(hWndTrackbar, TBM_SETPAGESIZE, 0, -2);
659     expect(20, r);
660     r = SendMessageA(hWndTrackbar, TBM_GETPAGESIZE, 0, 0);
661     expect(-2, r);
662 
663     DestroyWindow(hWndTrackbar);
664 }
665 
666 static void test_position(void)
667 {
668     HWND hWndTrackbar;
669     RECT rect, rect2;
670     WNDPROC oldproc;
671     int r;
672 
673     hWndTrackbar = create_trackbar(defaultstyle, hWndParent);
674     ok(hWndTrackbar != NULL, "Expected non NULL value\n");
675 
676     flush_sequences(sequences, NUM_MSG_SEQUENCE);
677 
678     /* test TBM_SETPOS */
679     SendMessageA(hWndTrackbar, TBM_SETPOS, TRUE, -1);
680     r = SendMessageA(hWndTrackbar, TBM_GETPOS, 0, 0);
681     expect(0, r);
682     SendMessageA(hWndTrackbar, TBM_SETPOS, TRUE, 5);
683     r = SendMessageA(hWndTrackbar, TBM_GETPOS, 0,0);
684     expect(5, r);
685     SendMessageA(hWndTrackbar, TBM_SETPOS, TRUE, 5);
686     SendMessageA(hWndTrackbar, TBM_SETPOS, TRUE, 1000);
687     r = SendMessageA(hWndTrackbar, TBM_GETPOS, 0,0);
688     expect(100, r);
689     SendMessageA(hWndTrackbar, TBM_SETPOS, FALSE, 20);
690     r = SendMessageA(hWndTrackbar, TBM_GETPOS, 0,0);
691     expect(20, r);
692     SendMessageA(hWndTrackbar, TBM_SETPOS, TRUE, 20);
693 
694     /* test TBM_GETPOS */
695     r = SendMessageA(hWndTrackbar, TBM_GETPOS, 0,0);
696     expect(20, r);
697 
698     ok_sequence(sequences, TRACKBAR_SEQ_INDEX, position_test_seq, "position test sequence", TRUE);
699     ok_sequence(sequences, PARENT_SEQ_INDEX, parent_position_test_seq, "parent position test sequence", TRUE);
700 
701     DestroyWindow(hWndTrackbar);
702 
703     hWndTrackbar = create_trackbar2(defaultstyle, hWndParent);
704     ok(hWndTrackbar != NULL, "Expected non NULL value\n");
705 
706     /* subclassing procedure blocks WM_PAINT */
707     oldproc = (WNDPROC)SetWindowLongPtrA(hWndTrackbar, GWLP_WNDPROC, (LONG_PTR)trackbar_no_wmpaint_proc);
708     SetWindowLongPtrA(hWndTrackbar, GWLP_USERDATA, (LONG_PTR)oldproc);
709 
710     SetRectEmpty(&rect);
711     SetRectEmpty(&rect2);
712 
713     SendMessageA(hWndTrackbar, TBM_GETTHUMBRECT, 0, (LPARAM)&rect);
714 
715     /* without repaint */
716     SendMessageA(hWndTrackbar, TBM_SETPOS, FALSE, 25);
717     r = SendMessageA(hWndTrackbar, TBM_GETPOS, 0, 0);
718     ok(r == 25, "got %d\n", r);
719     SendMessageA(hWndTrackbar, TBM_GETTHUMBRECT, 0, (LPARAM)&rect2);
720     ok(rect.left == rect2.left, "got %d\n", rect.left);
721 
722     /* with repaint */
723     SendMessageA(hWndTrackbar, TBM_SETPOS, TRUE, 30);
724     r = SendMessageA(hWndTrackbar, TBM_GETPOS, 0, 0);
725     ok(r == 30, "got %d\n", r);
726     SendMessageA(hWndTrackbar, TBM_GETTHUMBRECT, 0, (LPARAM)&rect2);
727     ok(rect.left != rect2.left, "got %d, expected %d\n", rect2.left, rect.left);
728 
729     /* now move it with keys */
730     SendMessageA(hWndTrackbar, WM_KEYDOWN, VK_END, 0);
731     r = SendMessageA(hWndTrackbar, TBM_GETPOS, 0, 0);
732     ok(r == 100, "got %d\n", r);
733     SendMessageA(hWndTrackbar, TBM_GETTHUMBRECT, 0, (LPARAM)&rect);
734     ok(rect.left != rect2.left, "got %d, expected %d\n", rect.left, rect2.left);
735 
736     DestroyWindow(hWndTrackbar);
737 }
738 
739 static void test_range(void)
740 {
741     HWND hWndTrackbar;
742     RECT rect1, rect2;
743     int r;
744 
745     hWndTrackbar = create_trackbar(defaultstyle, hWndParent);
746     ok(hWndTrackbar != NULL, "Expected non NULL value\n");
747 
748     flush_sequences(sequences, NUM_MSG_SEQUENCE);
749 
750     /* test TBM_SETRANGE */
751     SendMessageA(hWndTrackbar, TBM_SETRANGE, TRUE, MAKELONG(0, 10));
752     r = SendMessageA(hWndTrackbar, TBM_GETRANGEMAX, 0,0);
753     expect(10, r);
754     r = SendMessageA(hWndTrackbar, TBM_GETRANGEMIN, 0,0);
755     expect(0, r);
756     SendMessageA(hWndTrackbar, TBM_SETRANGE, TRUE, MAKELONG(-1, 1000));
757     r = SendMessageA(hWndTrackbar, TBM_GETRANGEMAX, 0,0);
758     expect(1000, r);
759     r = SendMessageA(hWndTrackbar, TBM_GETRANGEMIN, 0,0);
760     expect(-1, r);
761     SendMessageA(hWndTrackbar, TBM_SETRANGE, TRUE, MAKELONG(10, 0));
762     r = SendMessageA(hWndTrackbar, TBM_GETRANGEMAX, 0,0);
763     expect(0, r);
764     r = SendMessageA(hWndTrackbar, TBM_GETRANGEMIN, 0,0);
765     expect(10, r);
766     SendMessageA(hWndTrackbar, TBM_SETRANGE, FALSE, MAKELONG(0,10));
767     r = SendMessageA(hWndTrackbar, TBM_GETRANGEMAX, 0,0);
768     expect(10, r);
769     r = SendMessageA(hWndTrackbar, TBM_GETRANGEMIN, 0,0);
770     expect(0, r);
771 
772     /*test TBM_SETRANGEMAX */
773     SendMessageA(hWndTrackbar, TBM_SETRANGEMAX, TRUE, 10);
774     r = SendMessageA(hWndTrackbar, TBM_GETRANGEMAX, 0,0);
775     expect(10, r);
776     SendMessageA(hWndTrackbar, TBM_SETRANGEMAX, TRUE, -1);
777     r = SendMessageA(hWndTrackbar, TBM_GETRANGEMAX, 0,0);
778     expect(-1, r);
779     SendMessageA(hWndTrackbar, TBM_SETRANGEMAX, FALSE, 10);
780     r = SendMessageA(hWndTrackbar, TBM_GETRANGEMAX, 0,0);
781     expect(10, r);
782 
783     /* testing TBM_SETRANGEMIN */
784     SendMessageA(hWndTrackbar, TBM_SETRANGEMIN, TRUE, 0);
785     r = SendMessageA(hWndTrackbar, TBM_GETRANGEMIN, 0,0);
786     expect(0, r);
787     SendMessageA(hWndTrackbar, TBM_SETRANGEMIN, TRUE, 10);
788     r = SendMessageA(hWndTrackbar, TBM_GETRANGEMIN, 0,0);
789     expect(10, r);
790     SendMessageA(hWndTrackbar, TBM_SETRANGEMIN, TRUE, -10);
791     r = SendMessageA(hWndTrackbar, TBM_GETRANGEMIN, 0,0);
792     expect(-10, r);
793     SendMessageA(hWndTrackbar, TBM_SETRANGEMIN, FALSE, 5);
794     r = SendMessageA(hWndTrackbar, TBM_GETRANGEMIN, 0,0);
795     expect(5, r);
796 
797     /* test TBM_GETRANGEMAX */
798     r = SendMessageA(hWndTrackbar, TBM_GETRANGEMAX, 0,0);
799     expect(10, r);
800 
801     /* test TBM_GETRANGEMIN */
802     r = SendMessageA(hWndTrackbar, TBM_GETRANGEMIN, 0,0);
803     expect(5, r);
804 
805     ok_sequence(sequences, TRACKBAR_SEQ_INDEX, range_test_seq, "range test sequence", TRUE);
806     ok_sequence(sequences, PARENT_SEQ_INDEX, parent_range_test_seq, "parent range test sequence", TRUE);
807 
808     /* TBM_SETRANGE updates thumb visual position (rectangle) if needed */
809     r = SendMessageA(hWndTrackbar, TBM_SETRANGE, TRUE, MAKELONG(-10, 0));
810     ok(r == 0, "got %d\n", r);
811     SendMessageA(hWndTrackbar, TBM_SETPOS, TRUE, 0);
812 
813     RedrawWindow(hWndTrackbar, NULL, 0, RDW_UPDATENOW);
814     SendMessageA(hWndTrackbar, TBM_GETTHUMBRECT, 0, (LPARAM)&rect1);
815 
816     r = SendMessageA(hWndTrackbar, TBM_SETRANGE, TRUE, MAKELONG(-10, 10));
817     ok(r == 0, "got %d\n", r);
818     RedrawWindow(hWndTrackbar, NULL, 0, RDW_UPDATENOW);
819 
820     SendMessageA(hWndTrackbar, TBM_GETTHUMBRECT, 0, (LPARAM)&rect2);
821     ok(!EqualRect(&rect1, &rect2), "thumb rectangle not updated\n");
822 
823     /* change range back, don't force repaint */
824     r = SendMessageA(hWndTrackbar, TBM_SETRANGE, FALSE, MAKELONG(-10, 0));
825     ok(r == 0, "got %d\n", r);
826 
827     SendMessageA(hWndTrackbar, TBM_GETTHUMBRECT, 0, (LPARAM)&rect1);
828     ok(EqualRect(&rect1, &rect2), "thumb rectangle not updated\n");
829 
830     /* test position update on range change */
831 
832     /* set to [20, 50], position at 30, reduce range to [20,25] */
833     SendMessageA(hWndTrackbar, TBM_SETRANGEMIN, FALSE, 20);
834     SendMessageA(hWndTrackbar, TBM_SETRANGEMAX, FALSE, 50);
835     SendMessageA(hWndTrackbar, TBM_SETPOS, FALSE, 30);
836     SendMessageA(hWndTrackbar, TBM_SETRANGEMAX, FALSE, 25);
837     r = SendMessageA(hWndTrackbar, TBM_GETPOS, 0, 0);
838     ok(r == 25, "Unexpected position %d\n", r);
839 
840     /* set to [20, 50], position at 30, flip max to 10 */
841     SendMessageA(hWndTrackbar, TBM_SETRANGEMIN, FALSE, 20);
842     SendMessageA(hWndTrackbar, TBM_SETRANGEMAX, FALSE, 50);
843     SendMessageA(hWndTrackbar, TBM_SETPOS, FALSE, 30);
844     SendMessageA(hWndTrackbar, TBM_SETRANGEMAX, FALSE, 10);
845     r = SendMessageA(hWndTrackbar, TBM_GETPOS, 0, 0);
846     ok(r == 20, "Unexpected position %d\n", r);
847 
848     /* set to [20, 50], position at 30, flip min to 70 */
849     SendMessageA(hWndTrackbar, TBM_SETRANGEMIN, FALSE, 20);
850     SendMessageA(hWndTrackbar, TBM_SETRANGEMAX, FALSE, 50);
851     SendMessageA(hWndTrackbar, TBM_SETPOS, FALSE, 30);
852     SendMessageA(hWndTrackbar, TBM_SETRANGEMIN, FALSE, 70);
853     r = SendMessageA(hWndTrackbar, TBM_GETPOS, 0, 0);
854     ok(r == 70, "Unexpected position %d\n", r);
855 
856     DestroyWindow(hWndTrackbar);
857 }
858 
859 static void test_selection(void)
860 {
861     HWND hWndTrackbar;
862     int r;
863 
864     hWndTrackbar = create_trackbar(defaultstyle, hWndParent);
865     ok(hWndTrackbar != NULL, "Expected non NULL value\n");
866 
867     SendMessageA(hWndTrackbar, TBM_SETRANGEMIN, FALSE, 5);
868     SendMessageA(hWndTrackbar, TBM_SETRANGEMAX, FALSE, 10);
869 
870     flush_sequences(sequences, NUM_MSG_SEQUENCE);
871 
872     /* test TBM_SETSEL */
873     SendMessageA(hWndTrackbar, TBM_SETSEL, TRUE, MAKELONG(0,10));
874     r = SendMessageA(hWndTrackbar, TBM_GETSELEND, 0,0);
875     expect(10, r);
876     r = SendMessageA(hWndTrackbar, TBM_GETSELSTART, 0,0);
877     expect(5, r);
878     SendMessageA(hWndTrackbar, TBM_SETSEL, TRUE, MAKELONG(5, 20));
879     r = SendMessageA(hWndTrackbar, TBM_GETSELEND, 0,0);
880     expect(10, r);
881     r = SendMessageA(hWndTrackbar, TBM_GETSELSTART, 0,0);
882     expect(5, r);
883     SendMessageA(hWndTrackbar, TBM_SETSEL, FALSE, MAKELONG(5, 10));
884     r = SendMessageA(hWndTrackbar, TBM_GETSELEND, 0,0);
885     expect(10, r);
886     r = SendMessageA(hWndTrackbar, TBM_GETSELSTART, 0,0);
887     expect(5, r);
888 
889     /* test TBM_SETSELEND */
890     SendMessageA(hWndTrackbar, TBM_SETSELEND, TRUE, 10);
891     r = SendMessageA(hWndTrackbar, TBM_GETSELEND, 0,0);
892     expect(10, r);
893     SendMessageA(hWndTrackbar, TBM_SETSELEND, TRUE, 20);
894     r = SendMessageA(hWndTrackbar, TBM_GETSELEND, 0,0);
895     expect(10, r);
896     SendMessageA(hWndTrackbar, TBM_SETSELEND, TRUE, 4);
897     r = SendMessageA(hWndTrackbar, TBM_GETSELEND, 0,0);
898     expect(4, r);
899     SendMessageA(hWndTrackbar, TBM_SETSELEND, FALSE, 2);
900     r = SendMessageA(hWndTrackbar, TBM_GETSELEND, 0,0);
901     expect(2, r);
902 
903     /* test TBM_GETSELEND */
904     r = SendMessageA(hWndTrackbar, TBM_GETSELEND, 0,0);
905     expect(2, r);
906 
907     /* testing TBM_SETSELSTART */
908     SendMessageA(hWndTrackbar, TBM_SETSELSTART, TRUE, 5);
909     r = SendMessageA(hWndTrackbar, TBM_GETSELSTART, 0,0);
910     expect(5, r);
911     SendMessageA(hWndTrackbar, TBM_SETSELSTART, TRUE, 0);
912     r = SendMessageA(hWndTrackbar, TBM_GETSELSTART, 0,0);
913     expect(5, r);
914     SendMessageA(hWndTrackbar, TBM_SETSELSTART, TRUE, 20);
915     r = SendMessageA(hWndTrackbar, TBM_GETSELSTART, 0,0);
916     expect(20, r);
917     SendMessageA(hWndTrackbar, TBM_SETSELSTART, FALSE, 8);
918     r = SendMessageA(hWndTrackbar, TBM_GETSELSTART, 0,0);
919     expect(8, r);
920 
921     /* test TBM_GETSELSTART */
922     r = SendMessageA(hWndTrackbar, TBM_GETSELSTART, 0,0);
923     expect(8, r);
924 
925     ok_sequence(sequences, TRACKBAR_SEQ_INDEX, selection_test_seq, "selection test sequence", TRUE);
926     ok_sequence(sequences, PARENT_SEQ_INDEX, parent_selection_test_seq, "parent selection test sequence", TRUE);
927 
928     DestroyWindow(hWndTrackbar);
929 }
930 
931 static void test_thumb_length(void)
932 {
933     HWND hWndTrackbar;
934     int r, r2;
935 
936     hWndTrackbar = create_trackbar(defaultstyle, hWndParent);
937     ok(hWndTrackbar != NULL, "Expected non NULL value\n");
938 
939     flush_sequences(sequences, NUM_MSG_SEQUENCE);
940 
941     /* testing TBM_SETTHUMBLENGTH */
942     SendMessageA(hWndTrackbar, TBM_SETTHUMBLENGTH, 15, 0);
943     r = SendMessageA(hWndTrackbar, TBM_GETTHUMBLENGTH, 0,0);
944     expect(15, r);
945     SendMessageA(hWndTrackbar, TBM_SETTHUMBLENGTH, 20, 0);
946     r = SendMessageA(hWndTrackbar, TBM_GETTHUMBLENGTH, 0,0);
947     expect(20, r);
948 
949     /* test TBM_GETTHUMBLENGTH */
950     r = SendMessageA(hWndTrackbar, TBM_GETTHUMBLENGTH, 0,0);
951     expect(20, r);
952 
953     r = SendMessageA(hWndTrackbar, WM_SIZE, 0,0);
954     expect(0, r);
955     r = SendMessageA(hWndTrackbar, TBM_GETTHUMBLENGTH, 0,0);
956     expect(20, r);
957     r = SendMessageA(hWndTrackbar, WM_SIZE, 0, MAKELPARAM(50, 50) );
958     expect(0, r);
959     r = SendMessageA(hWndTrackbar, TBM_GETTHUMBLENGTH, 0,0);
960     expect(20, r);
961 
962     ok_sequence(sequences, TRACKBAR_SEQ_INDEX, thumb_length_test_seq, "thumb length test sequence", TRUE);
963     ok_sequence(sequences, PARENT_SEQ_INDEX, parent_thumb_length_test_seq, "parent thumb length test sequence", TRUE);
964 
965     DestroyWindow(hWndTrackbar);
966 
967     /* Fixed thumb length does not depend on window size. */
968     hWndTrackbar = CreateWindowA(TRACKBAR_CLASSA, "Trackbar Control", WS_VISIBLE | TBS_ENABLESELRANGE
969             | TBS_FIXEDLENGTH, 0, 0, 0, 0, hWndParent, NULL, GetModuleHandleA(NULL), NULL);
970 
971     r = SendMessageA(hWndTrackbar, TBM_GETTHUMBLENGTH, 0, 0);
972 
973     DestroyWindow(hWndTrackbar);
974 
975     hWndTrackbar = CreateWindowA(TRACKBAR_CLASSA, "Trackbar Control", WS_VISIBLE | TBS_ENABLESELRANGE
976             | TBS_FIXEDLENGTH, 0, 0, 200, 200, hWndParent, NULL, GetModuleHandleA(NULL), NULL);
977 
978     r2 = SendMessageA(hWndTrackbar, TBM_GETTHUMBLENGTH, 0, 0);
979     ok(r2 == r, "Unexpected thumb length %d.\n", r);
980 
981     DestroyWindow(hWndTrackbar);
982 }
983 
984 static void test_tic_settings(void)
985 {
986     HWND hWndTrackbar;
987     int r, i;
988 
989     hWndTrackbar = create_trackbar(defaultstyle, hWndParent);
990     ok(hWndTrackbar != NULL, "Expected non NULL value\n");
991 
992     SendMessageA(hWndTrackbar, TBM_SETRANGEMIN, FALSE, 5);
993     SendMessageA(hWndTrackbar, TBM_SETRANGEMAX, FALSE, 10);
994 
995     /* testing TBM_SETTIC */
996     /* Set tics at 5 and 10 */
997     /* 0 and 20 are out of range and should not be set */
998     r = SendMessageA(hWndTrackbar, TBM_GETRANGEMAX, 0, 0);
999     expect(10, r);
1000     r = SendMessageA(hWndTrackbar, TBM_GETRANGEMIN, 0, 0);
1001     expect(5, r);
1002 
1003     flush_sequences(sequences, NUM_MSG_SEQUENCE);
1004     r = SendMessageA(hWndTrackbar, TBM_SETTIC, 0, 0);
1005     ok(r == FALSE, "Expected FALSE, got %d\n", r);
1006     r = SendMessageA(hWndTrackbar, TBM_SETTIC, 0, 5);
1007     ok(r == TRUE, "Expected TRUE, got %d\n", r);
1008     r = SendMessageA(hWndTrackbar, TBM_SETTIC, 0, 10);
1009     ok(r == TRUE, "Expected TRUE, got %d\n", r);
1010 
1011     r = SendMessageA(hWndTrackbar, TBM_SETTIC, 0, 20);
1012     ok(r == FALSE, "Expected FALSE, got %d\n", r);
1013 
1014     /* test TBM_SETTICFREQ */
1015     SendMessageA(hWndTrackbar, TBM_SETRANGE, TRUE, MAKELONG(0, 10));
1016     SendMessageA(hWndTrackbar, TBM_SETTICFREQ, 2, 0);
1017     r = SendMessageA(hWndTrackbar, TBM_GETNUMTICS, 0, 0);
1018     expect(6, r);
1019     SendMessageA(hWndTrackbar, TBM_SETTICFREQ, 5, 0);
1020     r = SendMessageA(hWndTrackbar, TBM_GETNUMTICS, 0, 0);
1021     expect(3, r);
1022     SendMessageA(hWndTrackbar, TBM_SETTICFREQ, 15, 0);
1023     r = SendMessageA(hWndTrackbar, TBM_GETNUMTICS, 0, 0);
1024     expect(2, r);
1025 
1026     /* test TBM_GETNUMTICS */
1027     /* since TIC FREQ is 15, there should be only 2 tics now */
1028     r = SendMessageA(hWndTrackbar, TBM_GETNUMTICS, 0, 0);
1029     expect(2, r);
1030 
1031     ok_sequence(sequences, TRACKBAR_SEQ_INDEX, tic_settings_test_seq, "tic settings test sequence", TRUE);
1032     ok_sequence(sequences, PARENT_SEQ_INDEX, parent_tic_settings_test_seq, "parent tic settings test sequence", TRUE);
1033 
1034     /* range [0,0], freq = 1 */
1035     SendMessageA(hWndTrackbar, TBM_SETRANGEMAX, TRUE, 0);
1036     SendMessageA(hWndTrackbar, TBM_SETRANGEMIN, TRUE, 0);
1037     SendMessageA(hWndTrackbar, TBM_SETTICFREQ, 1, 0);
1038     r = SendMessageA(hWndTrackbar, TBM_GETNUMTICS, 0, 0);
1039     expect(2, r);
1040     /* range [0,1], freq = 1 */
1041     SendMessageA(hWndTrackbar, TBM_SETRANGEMAX, TRUE, 1);
1042     SendMessageA(hWndTrackbar, TBM_SETRANGEMIN, TRUE, 0);
1043     SendMessageA(hWndTrackbar, TBM_SETTICFREQ, 1, 0);
1044     r = SendMessageA(hWndTrackbar, TBM_GETNUMTICS, 0, 0);
1045     expect(2, r);
1046     /* range [0,2], freq = 1 */
1047     SendMessageA(hWndTrackbar, TBM_SETRANGEMAX, TRUE, 2);
1048     SendMessageA(hWndTrackbar, TBM_SETRANGEMIN, TRUE, 0);
1049     SendMessageA(hWndTrackbar, TBM_SETTICFREQ, 1, 0);
1050     r = SendMessageA(hWndTrackbar, TBM_GETNUMTICS, 0, 0);
1051     expect(3, r);
1052 
1053     DestroyWindow(hWndTrackbar);
1054 
1055     /* Test to show that TBM_SETTICFREQ updates thumb */
1056     for (i = 0; i < 2; i++)
1057     {
1058         DWORD style = i ? defaultstyle : defaultstyle & ~TBS_AUTOTICKS;
1059         RECT rect, rect1;
1060         WNDPROC oldproc;
1061 
1062         hWndTrackbar = create_trackbar2(style, hWndParent);
1063         ok(hWndTrackbar != NULL, "Expected non NULL value\n");
1064 
1065         oldproc = (WNDPROC)SetWindowLongPtrA(hWndTrackbar, GWLP_WNDPROC, (LONG_PTR)trackbar_no_wmpaint_proc);
1066         SetWindowLongPtrA(hWndTrackbar, GWLP_USERDATA, (LONG_PTR)oldproc);
1067 
1068         SendMessageA(hWndTrackbar, TBM_GETTHUMBRECT, 0, (LPARAM)&rect);
1069         SendMessageA(hWndTrackbar, TBM_SETPOS, FALSE, 0);
1070         SendMessageA(hWndTrackbar, TBM_GETTHUMBRECT, 0, (LPARAM)&rect1);
1071         ok(EqualRect(&rect, &rect1), "Unexpected thumb rectangle %s, previous %s\n",
1072             wine_dbgstr_rect(&rect1), wine_dbgstr_rect(&rect));
1073 
1074         SendMessageA(hWndTrackbar, TBM_GETTHUMBRECT, 0, (LPARAM)&rect);
1075         SendMessageA(hWndTrackbar, TBM_SETRANGE, FALSE, MAKELONG(-100, 100));
1076         SendMessageA(hWndTrackbar, TBM_GETTHUMBRECT, 0, (LPARAM)&rect1);
1077         ok(EqualRect(&rect, &rect1), "Unexpected thumb rectangle %s, previous %s\n",
1078             wine_dbgstr_rect(&rect1), wine_dbgstr_rect(&rect));
1079         /* Old position is also 0, but thumb position will be different after range change */
1080         SendMessageA(hWndTrackbar, TBM_GETTHUMBRECT, 0, (LPARAM)&rect);
1081         SendMessageA(hWndTrackbar, TBM_SETPOS, TRUE, 0);
1082         SendMessageA(hWndTrackbar, TBM_GETTHUMBRECT, 0, (LPARAM)&rect1);
1083         ok(EqualRect(&rect, &rect1), "Unexpected thumb rectangle %s, previous %s\n",
1084             wine_dbgstr_rect(&rect1), wine_dbgstr_rect(&rect));
1085         /* Previous frequency is also 1, yet thumb is updated */
1086         SendMessageA(hWndTrackbar, TBM_GETTHUMBRECT, 0, (LPARAM)&rect);
1087         SendMessageA(hWndTrackbar, TBM_SETTICFREQ, 1, 0);
1088         SendMessageA(hWndTrackbar, TBM_GETTHUMBRECT, 0, (LPARAM)&rect1);
1089         ok(!EqualRect(&rect, &rect1), "Unexpected thumb rectangle %s, previous %s\n",
1090             wine_dbgstr_rect(&rect1), wine_dbgstr_rect(&rect));
1091 
1092         SetWindowLongPtrA(hWndTrackbar, GWLP_WNDPROC, (LONG_PTR)oldproc);
1093 
1094         DestroyWindow(hWndTrackbar);
1095     }
1096 }
1097 
1098 static void test_tic_placement(void)
1099 {
1100     HWND hWndTrackbar;
1101     int r;
1102     DWORD *rPTics;
1103     DWORD numtics;
1104 
1105     hWndTrackbar = create_trackbar(defaultstyle, hWndParent);
1106     ok(hWndTrackbar != NULL, "Expected non NULL value\n");
1107 
1108     SendMessageA(hWndTrackbar, TBM_SETRANGE, TRUE, MAKELONG(1, 6));
1109     SendMessageA(hWndTrackbar, TBM_SETTICFREQ, 1, 0);
1110 
1111     numtics = SendMessageA(hWndTrackbar, TBM_GETNUMTICS, 0, 0);
1112     ok(numtics == 6, "Expected 6, got %d\n", numtics);
1113 
1114     flush_sequences(sequences, NUM_MSG_SEQUENCE);
1115     /* test TBM_GETPTICS */
1116     rPTics = (DWORD *) SendMessageA(hWndTrackbar, TBM_GETPTICS, 0,0);
1117     expect(2, rPTics[0]);
1118     expect(3, rPTics[1]);
1119     expect(4, rPTics[2]);
1120     expect(5, rPTics[3]);
1121 
1122     /* test TBM_GETTIC */
1123     r = SendMessageA(hWndTrackbar, TBM_GETTIC, 0,0);
1124     expect(2, r);
1125     r = SendMessageA(hWndTrackbar, TBM_GETTIC, 2,0);
1126     expect(4, r);
1127     r = SendMessageA(hWndTrackbar, TBM_GETTIC, 4,0);
1128     expect(-1, r);
1129 
1130     /* test TBM_GETTICPIC */
1131     r = SendMessageA(hWndTrackbar, TBM_GETTICPOS, 0, 0);
1132     ok(r > 0, "Expected r > 0, got %d\n", r);
1133     r = SendMessageA(hWndTrackbar, TBM_GETTICPOS, 2, 0);
1134     ok(r > 0, "Expected r > 0, got %d\n", r);
1135 
1136     ok_sequence(sequences, TRACKBAR_SEQ_INDEX, tic_placement_test_seq, "get tic placement test sequence", FALSE);
1137     ok_sequence(sequences, PARENT_SEQ_INDEX, empty_seq, "parent get tic placement test sequence", FALSE);
1138 
1139     DestroyWindow(hWndTrackbar);
1140 }
1141 
1142 static void test_tool_tips(void)
1143 {
1144     HWND hWndTooltip, hWndTrackbar;
1145     HWND rTest;
1146     int r;
1147 
1148     hWndTrackbar = create_trackbar(defaultstyle, hWndParent);
1149     ok(hWndTrackbar != NULL, "Expected non NULL value\n");
1150 
1151     flush_sequences(sequences, NUM_MSG_SEQUENCE);
1152 
1153     /* testing TBM_SETTIPSIDE */
1154     r = SendMessageA(hWndTrackbar, TBM_SETTIPSIDE, TBTS_TOP, 0);
1155     expect(TBTS_TOP, r);
1156     r = SendMessageA(hWndTrackbar, TBM_SETTIPSIDE, TBTS_LEFT, 0);
1157     expect(TBTS_TOP, r);
1158     r = SendMessageA(hWndTrackbar, TBM_SETTIPSIDE, TBTS_BOTTOM, 0);
1159     expect(TBTS_LEFT, r);
1160     r = SendMessageA(hWndTrackbar, TBM_SETTIPSIDE, TBTS_RIGHT, 0);
1161     expect(TBTS_BOTTOM, r);
1162 
1163     /* testing TBM_SETTOOLTIPS */
1164     hWndTooltip = CreateWindowExA(WS_EX_TOPMOST, TOOLTIPS_CLASSA, NULL, 0,
1165                                   CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
1166                                   NULL, NULL, NULL, NULL);
1167 
1168     ok(hWndTooltip != NULL, "Expected non NULL value\n");
1169     if (hWndTooltip != NULL){
1170         SendMessageA(hWndTrackbar, TBM_SETTOOLTIPS, (LPARAM) hWndTooltip, 0);
1171         rTest = (HWND) SendMessageA(hWndTrackbar, TBM_GETTOOLTIPS, 0,0);
1172         ok(rTest == hWndTooltip, "Expected hWndToolTip, got\n");
1173         SendMessageA(hWndTrackbar, TBM_SETTOOLTIPS, 0, 0);
1174         rTest = (HWND) SendMessageA(hWndTrackbar, TBM_GETTOOLTIPS, 0,0);
1175         ok(rTest == NULL, "Expected NULL\n");
1176         SendMessageA(hWndTrackbar, TBM_SETTOOLTIPS, (LPARAM) hWndTooltip, 5);
1177         rTest = (HWND) SendMessageA(hWndTrackbar, TBM_GETTOOLTIPS, 0,0);
1178         ok(rTest == hWndTooltip, "Expected hWndTooltip, got\n");
1179     } else
1180         skip("tool tip control not present?\n");
1181 
1182     /* test TBM_GETTOOLTIPS */
1183     rTest = (HWND) SendMessageA(hWndTrackbar, TBM_GETTOOLTIPS, 0,0);
1184     ok(rTest == hWndTooltip, "Expected hWndTooltip\n");
1185 
1186     ok_sequence(sequences, TRACKBAR_SEQ_INDEX, tool_tips_test_seq, "tool tips test sequence", FALSE);
1187     ok_sequence(sequences, PARENT_SEQ_INDEX, empty_seq, "parent tool tips test sequence", FALSE);
1188 
1189     DestroyWindow(hWndTrackbar);
1190 }
1191 
1192 
1193 static void test_unicode(void)
1194 {
1195     HWND hWndTrackbar;
1196     int r;
1197 
1198     hWndTrackbar = create_trackbar(defaultstyle, hWndParent);
1199     ok(hWndTrackbar != NULL, "Expected non NULL value\n");
1200 
1201     flush_sequences(sequences, NUM_MSG_SEQUENCE);
1202 
1203     /* testing TBM_SETUNICODEFORMAT */
1204     r = SendMessageA(hWndTrackbar, TBM_SETUNICODEFORMAT, TRUE, 0);
1205     ok(r == FALSE, "Expected FALSE, got %d\n",r);
1206     r = SendMessageA(hWndTrackbar, TBM_SETUNICODEFORMAT, FALSE, 0);
1207     ok(r == TRUE, "Expected TRUE, got %d\n",r);
1208 
1209     /* test TBM_GETUNICODEFORMAT */
1210     r = SendMessageA(hWndTrackbar, TBM_GETUNICODEFORMAT, 0,0);
1211     ok(r == FALSE, "Expected FALSE, got %d\n",r);
1212 
1213     ok_sequence(sequences, TRACKBAR_SEQ_INDEX, unicode_test_seq, "unicode test sequence", FALSE);
1214     ok_sequence(sequences, PARENT_SEQ_INDEX, empty_seq, "parent unicode test sequence", FALSE);
1215 
1216     DestroyWindow(hWndTrackbar);
1217 }
1218 
1219 static void test_ignore_selection(void)
1220 {
1221     HWND hWndTrackbar;
1222     int r;
1223 
1224     hWndTrackbar = create_trackbar(0, hWndParent);
1225     ok(hWndTrackbar != NULL, "Expected non NULL value\n");
1226 
1227     flush_sequences(sequences, NUM_MSG_SEQUENCE);
1228     /* test TBM_SETSEL  ensure that it is ignored */
1229     SendMessageA(hWndTrackbar, TBM_SETSEL, TRUE, MAKELONG(0,10));
1230     r = SendMessageA(hWndTrackbar, TBM_GETSELEND, 0,0);
1231     expect(0, r);
1232     r = SendMessageA(hWndTrackbar, TBM_GETSELSTART, 0,0);
1233     expect(0, r);
1234     SendMessageA(hWndTrackbar, TBM_SETSEL, FALSE, MAKELONG(0,10));
1235     r = SendMessageA(hWndTrackbar, TBM_GETSELEND, 0,0);
1236     expect(0, r);
1237     r = SendMessageA(hWndTrackbar, TBM_GETSELSTART, 0,0);
1238     expect(0, r);
1239 
1240     /* test TBM_SETSELEND, ensure that it is ignored */
1241     SendMessageA(hWndTrackbar, TBM_SETSELEND, TRUE, 0);
1242     r = SendMessageA(hWndTrackbar, TBM_GETSELEND, 0,0);
1243     expect(0, r);
1244     SendMessageA(hWndTrackbar, TBM_SETSELEND, TRUE, 10);
1245     r = SendMessageA(hWndTrackbar, TBM_GETSELEND, 0,0);
1246     expect(0,r);
1247     SendMessageA(hWndTrackbar, TBM_SETSELEND, FALSE, 0);
1248     r = SendMessageA(hWndTrackbar, TBM_GETSELEND, 0,0);
1249     expect(0, r);
1250 
1251     /* test TBM_SETSELSTART, ensure that it is ignored */
1252     SendMessageA(hWndTrackbar, TBM_SETSELSTART, TRUE, 0);
1253     r = SendMessageA(hWndTrackbar, TBM_GETSELSTART, 0,0);
1254     expect(0, r);
1255     SendMessageA(hWndTrackbar, TBM_SETSELSTART, TRUE, 10);
1256     r = SendMessageA(hWndTrackbar, TBM_GETSELSTART, 0,0);
1257     expect(0,r);
1258     SendMessageA(hWndTrackbar, TBM_SETSELSTART, FALSE, 0);
1259     r = SendMessageA(hWndTrackbar, TBM_GETSELSTART, 0,0);
1260     expect(0, r);
1261 
1262     ok_sequence(sequences, TRACKBAR_SEQ_INDEX, ignore_selection_test_seq, "ignore selection setting test sequence", FALSE);
1263     ok_sequence(sequences, PARENT_SEQ_INDEX, empty_seq, "parent ignore selection setting test sequence", FALSE);
1264 
1265     DestroyWindow(hWndTrackbar);
1266 }
1267 
1268 static void test_initial_state(void)
1269 {
1270     HWND hWnd;
1271     int ret;
1272 
1273     hWnd = create_trackbar(0, hWndParent);
1274 
1275     ret = SendMessageA(hWnd, TBM_GETNUMTICS, 0, 0);
1276     expect(2, ret);
1277     ret = SendMessageA(hWnd, TBM_GETTIC, 0, 0);
1278     expect(-1, ret);
1279     ret = SendMessageA(hWnd, TBM_GETTICPOS, 0, 0);
1280     expect(-1, ret);
1281     ret = SendMessageA(hWnd, TBM_GETRANGEMIN, 0, 0);
1282     expect(0, ret);
1283     ret = SendMessageA(hWnd, TBM_GETRANGEMAX, 0, 0);
1284     expect(100, ret);
1285 
1286     ret = SendMessageA(hWnd, TBM_SETRANGEMAX, TRUE, 200);
1287     expect(0, ret);
1288 
1289     ret = SendMessageA(hWnd, TBM_GETNUMTICS, 0, 0);
1290     expect(2, ret);
1291 
1292     ret = SendMessageA(hWnd, TBM_SETRANGEMIN, TRUE, 10);
1293     expect(0, ret);
1294 
1295     ret = SendMessageA(hWnd, TBM_GETNUMTICS, 0, 0);
1296     expect(2, ret);
1297 
1298     DestroyWindow(hWnd);
1299 }
1300 
1301 static void test_TBS_AUTOTICKS(void)
1302 {
1303     HWND hWnd;
1304     int ret;
1305 
1306     hWnd = create_trackbar(TBS_AUTOTICKS, hWndParent);
1307 
1308     ret = SendMessageA(hWnd, TBM_GETNUMTICS, 0, 0);
1309     expect(2, ret);
1310     ret = SendMessageA(hWnd, TBM_GETTIC, 0, 0);
1311     expect(-1, ret);
1312     ret = SendMessageA(hWnd, TBM_GETTICPOS, 0, 0);
1313     expect(-1, ret);
1314     ret = SendMessageA(hWnd, TBM_GETRANGEMIN, 0, 0);
1315     expect(0, ret);
1316     ret = SendMessageA(hWnd, TBM_GETRANGEMAX, 0, 0);
1317     expect(100, ret);
1318 
1319     /* TBM_SETRANGEMAX rebuilds tics */
1320     ret = SendMessageA(hWnd, TBM_SETRANGEMAX, TRUE, 200);
1321     expect(0, ret);
1322     ret = SendMessageA(hWnd, TBM_GETNUMTICS, 0, 0);
1323     expect(201, ret);
1324 
1325     /* TBM_SETRANGEMIN rebuilds tics */
1326     ret = SendMessageA(hWnd, TBM_SETRANGEMAX, TRUE, 100);
1327     expect(0, ret);
1328     ret = SendMessageA(hWnd, TBM_SETRANGEMIN, TRUE, 10);
1329     expect(0, ret);
1330     ret = SendMessageA(hWnd, TBM_GETNUMTICS, 0, 0);
1331     expect(91, ret);
1332 
1333     ret = SendMessageA(hWnd, TBM_SETRANGEMIN, TRUE, 0);
1334     expect(0, ret);
1335 
1336     /* TBM_SETRANGE rebuilds tics */
1337     ret = SendMessageA(hWnd, TBM_SETRANGE, TRUE, MAKELONG(10, 200));
1338     expect(0, ret);
1339     ret = SendMessageA(hWnd, TBM_GETNUMTICS, 0, 0);
1340     expect(191, ret);
1341 
1342     DestroyWindow(hWnd);
1343 }
1344 
1345 static void test_create(void)
1346 {
1347     HWND hWndTrackbar;
1348 
1349     flush_sequences(sequences, NUM_MSG_SEQUENCE);
1350 
1351     hWndTrackbar = create_trackbar(defaultstyle, hWndParent);
1352     ok(hWndTrackbar != NULL, "Expected non NULL value\n");
1353     ok_sequence(sequences, TRACKBAR_SEQ_INDEX, empty_seq, "create Trackbar Window", FALSE);
1354     ok_sequence(sequences, PARENT_SEQ_INDEX, parent_create_trackbar_wnd_seq, "parent trackbar window", TRUE);
1355 
1356     DestroyWindow(hWndTrackbar);
1357 
1358     /* no style bits */
1359     flush_sequences(sequences, NUM_MSG_SEQUENCE);
1360     hWndTrackbar = create_trackbar(0, hWndParent);
1361     ok(hWndTrackbar != NULL, "Expected non NULL value\n");
1362     ok_sequence(sequences, PARENT_SEQ_INDEX, parent_new_window_test_seq, "new trackbar window test sequence", TRUE);
1363     DestroyWindow(hWndTrackbar);
1364 }
1365 
1366 START_TEST(trackbar)
1367 {
1368     ULONG_PTR cookie;
1369     HANDLE ctxt;
1370 
1371     LoadLibraryA("comctl32.dll");
1372 
1373     init_msg_sequences(sequences, NUM_MSG_SEQUENCE);
1374 
1375     /* create parent window */
1376     hWndParent = create_parent_window();
1377     ok(hWndParent != NULL, "Failed to create parent Window!\n");
1378 
1379     if(!hWndParent){
1380         skip("parent window not present\n");
1381         return;
1382     }
1383 
1384     test_create();
1385     test_trackbar_buddy();
1386     test_line_size();
1387     test_page_size();
1388     test_position();
1389     test_range();
1390     test_selection();
1391     test_thumb_length();
1392     test_tic_settings();
1393     test_tic_placement();
1394     test_tool_tips();
1395     test_unicode();
1396     test_TBS_AUTOTICKS();
1397     test_ignore_selection();
1398     test_initial_state();
1399 
1400     if (!load_v6_module(&cookie, &ctxt))
1401         return;
1402 
1403     test_trackbar_buddy();
1404     test_line_size();
1405     test_page_size();
1406     test_position();
1407     test_range();
1408     test_selection();
1409     test_thumb_length();
1410     test_tic_settings();
1411     test_tic_placement();
1412     test_tool_tips();
1413     test_unicode();
1414     test_TBS_AUTOTICKS();
1415     test_ignore_selection();
1416     test_initial_state();
1417 
1418     unload_v6_module(cookie, ctxt);
1419 
1420     DestroyWindow(hWndParent);
1421 }
1422