mshtml: Implement IHTMLDOMNode replaceChild.
[wine] / dlls / dinput8 / tests / dinput.c
1 /*
2  * Copyright (c) 2011 Andrew Nguyen
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this library; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
17  */
18
19 #define DIRECTINPUT_VERSION 0x0800
20
21 #define COBJMACROS
22 #include <initguid.h>
23 #include <windows.h>
24 #include <dinput.h>
25
26 #include "wine/test.h"
27
28 HINSTANCE hInstance;
29
30 static BOOL CALLBACK dummy_callback(const DIDEVICEINSTANCEA *instance, void *context)
31 {
32     ok(0, "Callback was invoked with parameters (%p, %p)\n", instance, context);
33     return DIENUM_STOP;
34 }
35
36 static void test_preinitialization(void)
37 {
38     static const struct
39     {
40         REFGUID rguid;
41         BOOL pdev;
42         HRESULT expected_hr;
43     } create_device_tests[] =
44     {
45         {NULL, FALSE, E_POINTER},
46         {NULL, TRUE, E_POINTER},
47         {&GUID_Unknown, FALSE, E_POINTER},
48         {&GUID_Unknown, TRUE, DIERR_NOTINITIALIZED},
49         {&GUID_SysMouse, FALSE, E_POINTER},
50         {&GUID_SysMouse, TRUE, DIERR_NOTINITIALIZED},
51     };
52
53     static const struct
54     {
55         DWORD dwDevType;
56         LPDIENUMDEVICESCALLBACKA lpCallback;
57         DWORD dwFlags;
58         HRESULT expected_hr;
59         int todo;
60     } enum_devices_tests[] =
61     {
62         {0, NULL, 0, DIERR_INVALIDPARAM},
63         {0, NULL, ~0u, DIERR_INVALIDPARAM},
64         {0, dummy_callback, 0, DIERR_NOTINITIALIZED},
65         {0, dummy_callback, ~0u, DIERR_INVALIDPARAM, 1},
66         {0xdeadbeef, NULL, 0, DIERR_INVALIDPARAM},
67         {0xdeadbeef, NULL, ~0u, DIERR_INVALIDPARAM},
68         {0xdeadbeef, dummy_callback, 0, DIERR_INVALIDPARAM, 1},
69         {0xdeadbeef, dummy_callback, ~0u, DIERR_INVALIDPARAM, 1},
70     };
71
72     IDirectInput8A *pDI;
73     HRESULT hr;
74     int i;
75     IDirectInputDevice8A *pDID;
76
77     hr = CoCreateInstance(&CLSID_DirectInput8, NULL, CLSCTX_INPROC_SERVER, &IID_IDirectInput8A, (void **)&pDI);
78     if (FAILED(hr))
79     {
80         skip("Failed to instantiate a IDirectInputA instance: 0x%08x\n", hr);
81         return;
82     }
83
84     for (i = 0; i < sizeof(create_device_tests)/sizeof(create_device_tests[0]); i++)
85     {
86         if (create_device_tests[i].pdev) pDID = (void *)0xdeadbeef;
87         hr = IDirectInput8_CreateDevice(pDI, create_device_tests[i].rguid,
88                                             create_device_tests[i].pdev ? &pDID : NULL,
89                                             NULL);
90         ok(hr == create_device_tests[i].expected_hr, "[%d] IDirectInput8_CreateDevice returned 0x%08x\n", i, hr);
91         if (create_device_tests[i].pdev)
92             ok(pDID == NULL, "[%d] Output interface pointer is %p\n", i, pDID);
93     }
94
95     for (i = 0; i < sizeof(enum_devices_tests)/sizeof(enum_devices_tests[0]); i++)
96     {
97         hr = IDirectInput8_EnumDevices(pDI, enum_devices_tests[i].dwDevType,
98                                            enum_devices_tests[i].lpCallback,
99                                            NULL,
100                                            enum_devices_tests[i].dwFlags);
101         if (enum_devices_tests[i].todo)
102         {
103             todo_wine
104             ok(hr == enum_devices_tests[i].expected_hr, "[%d] IDirectInput8_EnumDevice returned 0x%08x\n", i, hr);
105         }
106         else
107             ok(hr == enum_devices_tests[i].expected_hr, "[%d] IDirectInput8_EnumDevice returned 0x%08x\n", i, hr);
108     }
109
110     hr = IDirectInput8_GetDeviceStatus(pDI, NULL);
111     todo_wine
112     ok(hr == E_POINTER, "IDirectInput8_GetDeviceStatus returned 0x%08x\n", hr);
113
114     hr = IDirectInput8_GetDeviceStatus(pDI, &GUID_Unknown);
115     ok(hr == DIERR_NOTINITIALIZED, "IDirectInput8_GetDeviceStatus returned 0x%08x\n", hr);
116
117     hr = IDirectInput8_GetDeviceStatus(pDI, &GUID_SysMouse);
118     ok(hr == DIERR_NOTINITIALIZED, "IDirectInput8_GetDeviceStatus returned 0x%08x\n", hr);
119
120     hr = IDirectInput8_RunControlPanel(pDI, NULL, 0);
121     ok(hr == DIERR_NOTINITIALIZED, "IDirectInput8_RunControlPanel returned 0x%08x\n", hr);
122
123     hr = IDirectInput8_RunControlPanel(pDI, NULL, ~0u);
124     ok(hr == DIERR_INVALIDPARAM, "IDirectInput8_RunControlPanel returned 0x%08x\n", hr);
125
126     hr = IDirectInput8_RunControlPanel(pDI, (HWND)0xdeadbeef, 0);
127     ok(hr == E_HANDLE, "IDirectInput8_RunControlPanel returned 0x%08x\n", hr);
128
129     hr = IDirectInput8_RunControlPanel(pDI, (HWND)0xdeadbeef, ~0u);
130     ok(hr == E_HANDLE, "IDirectInput8_RunControlPanel returned 0x%08x\n", hr);
131
132     IDirectInput8_Release(pDI);
133 }
134
135 static void test_DirectInput8Create(void)
136 {
137     static const struct
138     {
139         BOOL hinst;
140         DWORD dwVersion;
141         REFIID riid;
142         BOOL ppdi;
143         HRESULT expected_hr;
144     } invalid_param_list[] =
145     {
146         {FALSE, 0,                       &IID_IDirectInputA,  FALSE, E_POINTER},
147         {FALSE, 0,                       &IID_IDirectInputA,  TRUE,  DIERR_NOINTERFACE},
148         {FALSE, 0,                       &IID_IDirectInput8A, FALSE, E_POINTER},
149         {FALSE, 0,                       &IID_IDirectInput8A, TRUE,  DIERR_INVALIDPARAM},
150         {FALSE, DIRECTINPUT_VERSION,     &IID_IDirectInputA,  FALSE, E_POINTER},
151         {FALSE, DIRECTINPUT_VERSION,     &IID_IDirectInputA,  TRUE,  DIERR_NOINTERFACE},
152         {FALSE, DIRECTINPUT_VERSION,     &IID_IDirectInput8A, FALSE, E_POINTER},
153         {FALSE, DIRECTINPUT_VERSION,     &IID_IDirectInput8A, TRUE,  DIERR_INVALIDPARAM},
154         {FALSE, DIRECTINPUT_VERSION - 1, &IID_IDirectInputA,  FALSE, E_POINTER},
155         {FALSE, DIRECTINPUT_VERSION - 1, &IID_IDirectInputA,  TRUE,  DIERR_NOINTERFACE},
156         {FALSE, DIRECTINPUT_VERSION - 1, &IID_IDirectInput8A, FALSE, E_POINTER},
157         {FALSE, DIRECTINPUT_VERSION - 1, &IID_IDirectInput8A, TRUE,  DIERR_INVALIDPARAM},
158         {FALSE, DIRECTINPUT_VERSION + 1, &IID_IDirectInputA,  FALSE, E_POINTER},
159         {FALSE, DIRECTINPUT_VERSION + 1, &IID_IDirectInputA,  TRUE,  DIERR_NOINTERFACE},
160         {FALSE, DIRECTINPUT_VERSION + 1, &IID_IDirectInput8A, FALSE, E_POINTER},
161         {FALSE, DIRECTINPUT_VERSION + 1, &IID_IDirectInput8A, TRUE,  DIERR_INVALIDPARAM},
162         {TRUE,  0,                       &IID_IDirectInputA,  FALSE, E_POINTER},
163         {TRUE,  0,                       &IID_IDirectInputA,  TRUE,  DIERR_NOINTERFACE},
164         {TRUE,  0,                       &IID_IDirectInput8A, FALSE, E_POINTER},
165         {TRUE,  0,                       &IID_IDirectInput8A, TRUE,  DIERR_NOTINITIALIZED},
166         {TRUE,  DIRECTINPUT_VERSION,     &IID_IDirectInputA,  FALSE, E_POINTER},
167         {TRUE,  DIRECTINPUT_VERSION,     &IID_IDirectInputA,  TRUE,  DIERR_NOINTERFACE},
168         {TRUE,  DIRECTINPUT_VERSION,     &IID_IDirectInput8A, FALSE, E_POINTER},
169         {TRUE,  DIRECTINPUT_VERSION - 1, &IID_IDirectInputA,  FALSE, E_POINTER},
170         {TRUE,  DIRECTINPUT_VERSION - 1, &IID_IDirectInputA,  TRUE,  DIERR_NOINTERFACE},
171         {TRUE,  DIRECTINPUT_VERSION - 1, &IID_IDirectInput8A, FALSE, E_POINTER},
172         {TRUE,  DIRECTINPUT_VERSION - 1, &IID_IDirectInput8A, TRUE,  DIERR_BETADIRECTINPUTVERSION},
173         {TRUE,  DIRECTINPUT_VERSION + 1, &IID_IDirectInputA,  FALSE, E_POINTER},
174         {TRUE,  DIRECTINPUT_VERSION + 1, &IID_IDirectInputA,  TRUE,  DIERR_NOINTERFACE},
175         {TRUE,  DIRECTINPUT_VERSION + 1, &IID_IDirectInput8A, FALSE, E_POINTER},
176         {TRUE,  DIRECTINPUT_VERSION + 1, &IID_IDirectInput8A, TRUE,  DIERR_OLDDIRECTINPUTVERSION},
177     };
178
179     static REFIID no_interface_list[] = {&IID_IDirectInputA, &IID_IDirectInputW,
180                                          &IID_IDirectInput2A, &IID_IDirectInput2W,
181                                          &IID_IDirectInput7A, &IID_IDirectInput7W,
182                                          &IID_IDirectInputDeviceA, &IID_IDirectInputDeviceW,
183                                          &IID_IDirectInputDevice2A, &IID_IDirectInputDevice2W,
184                                          &IID_IDirectInputDevice7A, &IID_IDirectInputDevice7W,
185                                          &IID_IDirectInputDevice8A, &IID_IDirectInputDevice8W,
186                                          &IID_IDirectInputEffect};
187
188     static REFIID iid_list[] = {&IID_IUnknown, &IID_IDirectInput8A, &IID_IDirectInput8W};
189
190     int i;
191     IUnknown *pUnk;
192     HRESULT hr;
193
194     for (i = 0; i < sizeof(invalid_param_list)/sizeof(invalid_param_list[0]); i++)
195     {
196         if (invalid_param_list[i].ppdi) pUnk = (void *)0xdeadbeef;
197         hr = DirectInput8Create(invalid_param_list[i].hinst ? hInstance : NULL,
198                                 invalid_param_list[i].dwVersion,
199                                 invalid_param_list[i].riid,
200                                 invalid_param_list[i].ppdi ? (void **)&pUnk : NULL,
201                                 NULL);
202         ok(hr == invalid_param_list[i].expected_hr, "[%d] DirectInput8Create returned 0x%08x\n", i, hr);
203         if (invalid_param_list[i].ppdi)
204             ok(pUnk == NULL, "[%d] Output interface pointer is %p\n", i, pUnk);
205     }
206
207     for (i = 0; i < sizeof(no_interface_list)/sizeof(no_interface_list[0]); i++)
208     {
209         pUnk = (void *)0xdeadbeef;
210         hr = DirectInput8Create(hInstance, DIRECTINPUT_VERSION, no_interface_list[i], (void **)&pUnk, NULL);
211         ok(hr == DIERR_NOINTERFACE, "[%d] DirectInput8Create returned 0x%08x\n", i, hr);
212         ok(pUnk == NULL, "[%d] Output interface pointer is %p\n", i, pUnk);
213     }
214
215     for (i = 0; i < sizeof(iid_list)/sizeof(iid_list[0]); i++)
216     {
217         pUnk = NULL;
218         hr = DirectInput8Create(hInstance, DIRECTINPUT_VERSION, iid_list[i], (void **)&pUnk, NULL);
219         ok(hr == DI_OK, "[%d] DirectInput8Create returned 0x%08x\n", i, hr);
220         ok(pUnk != NULL, "[%d] Output interface pointer is NULL\n", i);
221         if (pUnk)
222             IUnknown_Release(pUnk);
223     }
224 }
225
226 static void test_QueryInterface(void)
227 {
228     static REFIID iid_list[] = {&IID_IUnknown, &IID_IDirectInput8A, &IID_IDirectInput8W};
229
230     static const struct
231     {
232         REFIID riid;
233         int test_todo;
234     } no_interface_list[] =
235     {
236         {&IID_IDirectInputA, 1},
237         {&IID_IDirectInputW, 1},
238         {&IID_IDirectInput2A, 1},
239         {&IID_IDirectInput2W, 1},
240         {&IID_IDirectInput7A, 1},
241         {&IID_IDirectInput7W, 1},
242         {&IID_IDirectInputDeviceA},
243         {&IID_IDirectInputDeviceW},
244         {&IID_IDirectInputDevice2A},
245         {&IID_IDirectInputDevice2W},
246         {&IID_IDirectInputDevice7A},
247         {&IID_IDirectInputDevice7W},
248         {&IID_IDirectInputDevice8A},
249         {&IID_IDirectInputDevice8W},
250         {&IID_IDirectInputEffect},
251     };
252
253     IDirectInput8A *pDI;
254     HRESULT hr;
255     IUnknown *pUnk;
256     int i;
257
258     hr = DirectInput8Create(hInstance, DIRECTINPUT_VERSION, &IID_IDirectInput8A, (void **)&pDI, NULL);
259     if (FAILED(hr))
260     {
261         win_skip("Failed to instantiate a IDirectInputA instance: 0x%08x\n", hr);
262         return;
263     }
264
265     hr = IDirectInput8_QueryInterface(pDI, NULL, NULL);
266     ok(hr == E_POINTER, "IDirectInput8_QueryInterface returned 0x%08x\n", hr);
267
268     pUnk = (void *)0xdeadbeef;
269     hr = IDirectInput8_QueryInterface(pDI, NULL, (void **)&pUnk);
270     ok(hr == E_POINTER, "IDirectInput8_QueryInterface returned 0x%08x\n", hr);
271     ok(pUnk == (void *)0xdeadbeef, "Output interface pointer is %p\n", pUnk);
272
273     hr = IDirectInput8_QueryInterface(pDI, &IID_IUnknown, NULL);
274     ok(hr == E_POINTER, "IDirectInput8_QueryInterface returned 0x%08x\n", hr);
275
276     for (i = 0; i < sizeof(iid_list)/sizeof(iid_list[0]); i++)
277     {
278         pUnk = NULL;
279         hr = IDirectInput8_QueryInterface(pDI, iid_list[i], (void **)&pUnk);
280         ok(hr == S_OK, "[%d] IDirectInput8_QueryInterface returned 0x%08x\n", i, hr);
281         ok(pUnk != NULL, "[%d] Output interface pointer is NULL\n", i);
282         if (pUnk) IUnknown_Release(pUnk);
283     }
284
285     for (i = 0; i < sizeof(no_interface_list)/sizeof(no_interface_list[0]); i++)
286     {
287         pUnk = (void *)0xdeadbeef;
288         hr = IDirectInput8_QueryInterface(pDI, no_interface_list[i].riid, (void **)&pUnk);
289         if (no_interface_list[i].test_todo)
290         {
291             todo_wine
292             ok(hr == E_NOINTERFACE, "[%d] IDirectInput8_QueryInterface returned 0x%08x\n", i, hr);
293             todo_wine
294             ok(pUnk == NULL, "[%d] Output interface pointer is %p\n", i, pUnk);
295
296             if (pUnk) IUnknown_Release(pUnk);
297         }
298         else
299         {
300             ok(hr == E_NOINTERFACE, "[%d] IDirectInput8_QueryInterface returned 0x%08x\n", i, hr);
301             ok(pUnk == NULL, "[%d] Output interface pointer is %p\n", i, pUnk);
302         }
303     }
304
305     IDirectInput8_Release(pDI);
306 }
307
308 static void test_CreateDevice(void)
309 {
310     IDirectInput8A *pDI;
311     HRESULT hr;
312     IDirectInputDevice8A *pDID;
313
314     hr = DirectInput8Create(hInstance, DIRECTINPUT_VERSION, &IID_IDirectInput8A, (void **)&pDI, NULL);
315     if (FAILED(hr))
316     {
317         win_skip("Failed to instantiate a IDirectInputA instance: 0x%08x\n", hr);
318         return;
319     }
320
321     hr = IDirectInput8_CreateDevice(pDI, NULL, NULL, NULL);
322     ok(hr == E_POINTER, "IDirectInput8_CreateDevice returned 0x%08x\n", hr);
323
324     pDID = (void *)0xdeadbeef;
325     hr = IDirectInput8_CreateDevice(pDI, NULL, &pDID, NULL);
326     ok(hr == E_POINTER, "IDirectInput8_CreateDevice returned 0x%08x\n", hr);
327     ok(pDID == NULL, "Output interface pointer is %p\n", pDID);
328
329     hr = IDirectInput8_CreateDevice(pDI, &GUID_Unknown, NULL, NULL);
330     ok(hr == E_POINTER, "IDirectInput8_CreateDevice returned 0x%08x\n", hr);
331
332     pDID = (void *)0xdeadbeef;
333     hr = IDirectInput8_CreateDevice(pDI, &GUID_Unknown, &pDID, NULL);
334     ok(hr == DIERR_DEVICENOTREG, "IDirectInput8_CreateDevice returned 0x%08x\n", hr);
335     ok(pDID == NULL, "Output interface pointer is %p\n", pDID);
336
337     hr = IDirectInput8_CreateDevice(pDI, &GUID_SysMouse, NULL, NULL);
338     ok(hr == E_POINTER, "IDirectInput8_CreateDevice returned 0x%08x\n", hr);
339
340     hr = IDirectInput8_CreateDevice(pDI, &GUID_SysMouse, &pDID, NULL);
341     ok(hr == DI_OK, "IDirectInput8_CreateDevice returned 0x%08x\n", hr);
342
343     IDirectInputDevice_Release(pDID);
344     IDirectInput8_Release(pDI);
345 }
346
347 struct enum_devices_test
348 {
349     unsigned int device_count;
350     BOOL return_value;
351 };
352
353 static BOOL CALLBACK enum_devices_callback(const DIDEVICEINSTANCEA *instance, void *context)
354 {
355     struct enum_devices_test *enum_test = context;
356
357     enum_test->device_count++;
358     return enum_test->return_value;
359 }
360
361 static void test_EnumDevices(void)
362 {
363     IDirectInput8A *pDI;
364     HRESULT hr;
365     struct enum_devices_test enum_test, enum_test_return;
366
367     hr = DirectInput8Create(hInstance, DIRECTINPUT_VERSION, &IID_IDirectInput8A, (void **)&pDI, NULL);
368     if (FAILED(hr))
369     {
370         win_skip("Failed to instantiate a IDirectInputA instance: 0x%08x\n", hr);
371         return;
372     }
373
374     hr = IDirectInput8_EnumDevices(pDI, 0, NULL, NULL, 0);
375     ok(hr == DIERR_INVALIDPARAM, "IDirectInput8_EnumDevices returned 0x%08x\n", hr);
376
377     hr = IDirectInput8_EnumDevices(pDI, 0, NULL, NULL, ~0u);
378     ok(hr == DIERR_INVALIDPARAM, "IDirectInput8_EnumDevices returned 0x%08x\n", hr);
379
380     /* Test crashes on Wine. */
381     if (0)
382     {
383         hr = IDirectInput8_EnumDevices(pDI, 0, enum_devices_callback, NULL, ~0u);
384         ok(hr == DIERR_INVALIDPARAM, "IDirectInput8_EnumDevices returned 0x%08x\n", hr);
385     }
386
387     hr = IDirectInput8_EnumDevices(pDI, 0xdeadbeef, NULL, NULL, 0);
388     ok(hr == DIERR_INVALIDPARAM, "IDirectInput8_EnumDevices returned 0x%08x\n", hr);
389
390     hr = IDirectInput8_EnumDevices(pDI, 0xdeadbeef, NULL, NULL, ~0u);
391     ok(hr == DIERR_INVALIDPARAM, "IDirectInput8_EnumDevices returned 0x%08x\n", hr);
392
393     hr = IDirectInput8_EnumDevices(pDI, 0xdeadbeef, enum_devices_callback, NULL, 0);
394     todo_wine
395     ok(hr == DIERR_INVALIDPARAM, "IDirectInput8_EnumDevices returned 0x%08x\n", hr);
396
397     hr = IDirectInput8_EnumDevices(pDI, 0xdeadbeef, enum_devices_callback, NULL, ~0u);
398     todo_wine
399     ok(hr == DIERR_INVALIDPARAM, "IDirectInput8_EnumDevices returned 0x%08x\n", hr);
400
401     enum_test.device_count = 0;
402     enum_test.return_value = DIENUM_CONTINUE;
403     hr = IDirectInput8_EnumDevices(pDI, 0, enum_devices_callback, &enum_test, 0);
404     ok(hr == DI_OK, "IDirectInput8_EnumDevices returned 0x%08x\n", hr);
405     ok(enum_test.device_count != 0, "Device count is %u\n", enum_test.device_count);
406
407     /* Enumeration only stops with an explicit DIENUM_STOP. */
408     enum_test_return.device_count = 0;
409     enum_test_return.return_value = 42;
410     hr = IDirectInput8_EnumDevices(pDI, 0, enum_devices_callback, &enum_test_return, 0);
411     ok(hr == DI_OK, "IDirectInput8_EnumDevices returned 0x%08x\n", hr);
412     ok(enum_test_return.device_count == enum_test.device_count,
413        "Device count is %u vs. %u\n", enum_test_return.device_count, enum_test.device_count);
414
415     enum_test.device_count = 0;
416     enum_test.return_value = DIENUM_STOP;
417     hr = IDirectInput8_EnumDevices(pDI, 0, enum_devices_callback, &enum_test, 0);
418     ok(hr == DI_OK, "IDirectInput8_EnumDevices returned 0x%08x\n", hr);
419     ok(enum_test.device_count == 1, "Device count is %u\n", enum_test.device_count);
420
421     IDirectInput8_Release(pDI);
422 }
423
424 static void test_GetDeviceStatus(void)
425 {
426     IDirectInput8A *pDI;
427     HRESULT hr;
428
429     hr = DirectInput8Create(hInstance, DIRECTINPUT_VERSION, &IID_IDirectInput8A, (void **)&pDI, NULL);
430     if (FAILED(hr))
431     {
432         win_skip("Failed to instantiate a IDirectInputA instance: 0x%08x\n", hr);
433         return;
434     }
435
436     hr = IDirectInput8_GetDeviceStatus(pDI, NULL);
437     todo_wine
438     ok(hr == E_POINTER, "IDirectInput8_GetDeviceStatus returned 0x%08x\n", hr);
439
440     hr = IDirectInput8_GetDeviceStatus(pDI, &GUID_Unknown);
441     todo_wine
442     ok(hr == DIERR_DEVICENOTREG, "IDirectInput8_GetDeviceStatus returned 0x%08x\n", hr);
443
444     hr = IDirectInput8_GetDeviceStatus(pDI, &GUID_SysMouse);
445     ok(hr == DI_OK, "IDirectInput8_GetDeviceStatus returned 0x%08x\n", hr);
446
447     IDirectInput8_Release(pDI);
448 }
449
450 static void test_RunControlPanel(void)
451 {
452     IDirectInput8A *pDI;
453     HRESULT hr;
454
455     hr = DirectInput8Create(hInstance, DIRECTINPUT_VERSION, &IID_IDirectInput8A, (void **)&pDI, NULL);
456     if (FAILED(hr))
457     {
458         win_skip("Failed to instantiate a IDirectInputA instance: 0x%08x\n", hr);
459         return;
460     }
461
462     if (winetest_interactive)
463     {
464         hr = IDirectInput8_RunControlPanel(pDI, NULL, 0);
465         ok(hr == S_OK, "IDirectInput8_RunControlPanel returned 0x%08x\n", hr);
466
467         hr = IDirectInput8_RunControlPanel(pDI, GetDesktopWindow(), 0);
468         ok(hr == S_OK, "IDirectInput8_RunControlPanel returned 0x%08x\n", hr);
469     }
470
471     hr = IDirectInput8_RunControlPanel(pDI, NULL, ~0u);
472     ok(hr == DIERR_INVALIDPARAM, "IDirectInput8_RunControlPanel returned 0x%08x\n", hr);
473
474     hr = IDirectInput8_RunControlPanel(pDI, (HWND)0xdeadbeef, 0);
475     ok(hr == E_HANDLE, "IDirectInput8_RunControlPanel returned 0x%08x\n", hr);
476
477     hr = IDirectInput8_RunControlPanel(pDI, (HWND)0xdeadbeef, ~0u);
478     ok(hr == E_HANDLE, "IDirectInput8_RunControlPanel returned 0x%08x\n", hr);
479
480     IDirectInput8_Release(pDI);
481 }
482
483 static void test_Initialize(void)
484 {
485     IDirectInput8A *pDI;
486     HRESULT hr;
487
488     hr = DirectInput8Create(hInstance, DIRECTINPUT_VERSION, &IID_IDirectInput8A, (void **)&pDI, NULL);
489     if (FAILED(hr))
490     {
491         win_skip("Failed to instantiate a IDirectInputA instance: 0x%08x\n", hr);
492         return;
493     }
494
495     hr = IDirectInput8_Initialize(pDI, NULL, 0);
496     ok(hr == DIERR_INVALIDPARAM, "IDirectInput8_Initialize returned 0x%08x\n", hr);
497
498     hr = IDirectInput8_Initialize(pDI, NULL, DIRECTINPUT_VERSION);
499     ok(hr == DIERR_INVALIDPARAM, "IDirectInput8_Initialize returned 0x%08x\n", hr);
500
501     hr = IDirectInput8_Initialize(pDI, hInstance, 0);
502     ok(hr == DIERR_NOTINITIALIZED, "IDirectInput8_Initialize returned 0x%08x\n", hr);
503
504     /* Invalid DirectInput versions less than DIRECTINPUT_VERSION yield DIERR_BETADIRECTINPUTVERSION. */
505     hr = IDirectInput8_Initialize(pDI, hInstance, DIRECTINPUT_VERSION - 1);
506     ok(hr == DIERR_BETADIRECTINPUTVERSION, "IDirectInput8_Initialize returned 0x%08x\n", hr);
507
508     /* Invalid DirectInput versions greater than DIRECTINPUT_VERSION yield DIERR_BETADIRECTINPUTVERSION. */
509     hr = IDirectInput8_Initialize(pDI, hInstance, DIRECTINPUT_VERSION + 1);
510     ok(hr == DIERR_OLDDIRECTINPUTVERSION, "IDirectInput8_Initialize returned 0x%08x\n", hr);
511
512     hr = IDirectInput8_Initialize(pDI, hInstance, DIRECTINPUT_VERSION);
513     ok(hr == DI_OK, "IDirectInput8_Initialize returned 0x%08x\n", hr);
514
515     /* Parameters are still validated after successful initialization. */
516     hr = IDirectInput8_Initialize(pDI, hInstance, 0);
517     ok(hr == DIERR_NOTINITIALIZED, "IDirectInput8_Initialize returned 0x%08x\n", hr);
518
519     IDirectInput8_Release(pDI);
520 }
521
522 START_TEST(dinput)
523 {
524     hInstance = GetModuleHandleA(NULL);
525
526     CoInitialize(NULL);
527     test_preinitialization();
528     test_DirectInput8Create();
529     test_QueryInterface();
530     test_CreateDevice();
531     test_EnumDevices();
532     test_GetDeviceStatus();
533     test_RunControlPanel();
534     test_Initialize();
535     CoUninitialize();
536 }