comctl32: Proper fix redrawing the trackbar background with themes enabled.
[wine] / dlls / comctl32 / tests / misc.c
1 /*
2  * Misc tests
3  *
4  * Copyright 2006 Paul Vriens
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19  */
20
21 #include <stdio.h>
22 #include <windows.h>
23
24 #include "wine/test.h"
25
26 static PVOID (WINAPI * pAlloc)(LONG);
27 static PVOID (WINAPI * pReAlloc)(PVOID, LONG);
28 static BOOL (WINAPI * pFree)(PVOID);
29 static LONG (WINAPI * pGetSize)(PVOID);
30
31 static INT (WINAPI * pStr_GetPtrA)(LPCSTR, LPSTR, INT);
32 static BOOL (WINAPI * pStr_SetPtrA)(LPSTR, LPCSTR);
33 static INT (WINAPI * pStr_GetPtrW)(LPCWSTR, LPWSTR, INT);
34 static BOOL (WINAPI * pStr_SetPtrW)(LPWSTR, LPCWSTR);
35
36 static HMODULE hComctl32 = 0;
37
38 #define COMCTL32_GET_PROC(ordinal, func) \
39     p ## func = (void*)GetProcAddress(hComctl32, (LPSTR)ordinal); \
40     if(!p ## func) { \
41       trace("GetProcAddress(%d)(%s) failed\n", ordinal, #func); \
42       FreeLibrary(hComctl32); \
43     }
44
45 #define expect(expected, got) ok(expected == got, "expected %d, got %d\n", expected,got)
46
47 static BOOL InitFunctionPtrs(void)
48 {
49     hComctl32 = LoadLibraryA("comctl32.dll");
50
51     if(!hComctl32)
52     {
53         trace("Could not load comctl32.dll\n");
54         return FALSE;
55     }
56
57     COMCTL32_GET_PROC(71, Alloc);
58     COMCTL32_GET_PROC(72, ReAlloc);
59     COMCTL32_GET_PROC(73, Free);
60     COMCTL32_GET_PROC(74, GetSize);
61
62     COMCTL32_GET_PROC(233, Str_GetPtrA)
63     COMCTL32_GET_PROC(234, Str_SetPtrA)
64     COMCTL32_GET_PROC(235, Str_GetPtrW)
65     COMCTL32_GET_PROC(236, Str_SetPtrW)
66
67     return TRUE;
68 }
69
70 static void test_GetPtrAW(void)
71 {
72     if (pStr_GetPtrA)
73     {
74         static const char source[] = "Just a source string";
75         static const char desttest[] = "Just a destination string";
76         static char dest[MAX_PATH];
77         int sourcelen;
78         int destsize = MAX_PATH;
79         int count = -1;
80
81         sourcelen = strlen(source) + 1;
82
83         count = pStr_GetPtrA(NULL, NULL, 0);
84         ok (count == 0, "Expected count to be 0, it was %d\n", count);
85
86         if (0)
87         {
88             /* Crashes on W98, NT4, W2K, XP, W2K3
89              * Our implementation also crashes and we should probably leave
90              * it like that.
91              */
92             count = -1;
93             count = pStr_GetPtrA(NULL, NULL, destsize);
94             trace("count : %d\n", count);
95         }
96
97         count = 0;
98         count = pStr_GetPtrA(source, NULL, 0);
99         ok (count == sourcelen, "Expected count to be %d, it was %d\n", sourcelen , count);
100
101         count = 0;
102         strcpy(dest, desttest);
103         count = pStr_GetPtrA(source, dest, 0);
104         ok (count == sourcelen, "Expected count to be %d, it was %d\n", sourcelen , count);
105         ok (!lstrcmp(dest, desttest), "Expected destination to not have changed\n");
106
107         count = 0;
108         count = pStr_GetPtrA(source, NULL, destsize);
109         ok (count == sourcelen, "Expected count to be %d, it was %d\n", sourcelen , count);
110
111         count = 0;
112         count = pStr_GetPtrA(source, dest, destsize);
113         ok (count == sourcelen, "Expected count to be %d, it was %d\n", sourcelen , count);
114         ok (!lstrcmp(source, dest), "Expected source and destination to be the same\n");
115
116         count = -1;
117         strcpy(dest, desttest);
118         count = pStr_GetPtrA(NULL, dest, destsize);
119         ok (count == 0, "Expected count to be 0, it was %d\n", count);
120         ok (dest[0] == '\0', "Expected destination to be cut-off and 0 terminated\n");
121
122         count = 0;
123         destsize = 15;
124         count = pStr_GetPtrA(source, dest, destsize);
125         ok (count == 15, "Expected count to be 15, it was %d\n", count);
126         ok (!memcmp(source, dest, 14), "Expected first part of source and destination to be the same\n");
127         ok (dest[14] == '\0', "Expected destination to be cut-off and 0 terminated\n");
128     }
129 }
130
131 static void test_Alloc(void)
132 {
133     PCHAR p = pAlloc(0);
134     ok(p != NULL, "p=%p\n", p);
135     ok(pFree(p), "\n");
136     p = pAlloc(1);
137     ok(p != NULL, "\n");
138     *p = '\0';
139     expect(1, pGetSize(p));
140     p = pReAlloc(p, 2);
141     ok(p != NULL, "\n");
142     expect(2, pGetSize(p));
143     ok(pFree(p), "\n");
144     ok(pFree(NULL), "\n");
145     p = pReAlloc(NULL, 2);
146     ok(p != NULL, "\n");
147     ok(pFree(p), "\n");
148 }
149
150 START_TEST(misc)
151 {
152     if(!InitFunctionPtrs())
153         return;
154
155     test_GetPtrAW();
156     test_Alloc();
157
158     FreeLibrary(hComctl32);
159 }