Wine-Devel
By thread
wine-devel@list.winehq.org
By month
Messages by month
- ----- 2026 -----
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2005 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2004 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2003 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2002 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2001 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
June 2022
- 68 participants
- 3274 messages
[PATCH 2/2] ntdll: tests: Test returning an exception handler on arm/arm64
by Martin Storsjö
From: Martin Storsjö <martin(a)martin.st>
Signed-off-by: Martin Storsjö <martin(a)martin.st>
---
dlls/ntdll/tests/exception.c | 17 +++++++++++------
1 file changed, 11 insertions(+), 6 deletions(-)
diff --git a/dlls/ntdll/tests/exception.c b/dlls/ntdll/tests/exception.c
index aa24ae1704f..e3bfb99e421 100644
--- a/dlls/ntdll/tests/exception.c
+++ b/dlls/ntdll/tests/exception.c
@@ -5140,7 +5140,6 @@ static void call_virtual_unwind( int testnum, const struct unwind_test *test )
&runtime_func, &context, &data, &frame, &ctx_ptr );
if (test->results[i].handler > 0)
{
- /* Yet untested */
ok( (char *)handler == (char *)code_mem + 0x200,
"%u/%u: wrong handler %p/%p\n", testnum, i, handler, (char *)code_mem + 0x200 );
if (handler) ok( *(DWORD *)data == 0x08070605,
@@ -5278,7 +5277,7 @@ static void test_virtual_unwind(void)
static const DWORD unwind_info_0_header =
(sizeof(function_0)/2) | /* function length */
- (0 << 20) | /* X */
+ (1 << 20) | /* X */
(0 << 21) | /* E */
(0 << 22) | /* F */
(1 << 23) | /* epilog */
@@ -5309,6 +5308,10 @@ static void test_virtual_unwind(void)
UWOP_ALLOC_SMALL(32), /* add sp, sp, #32 */
UWOP_SAVE_RANGE_4_7_LR(6, 1), /* pop {r4-r6,pc} */
UWOP_END,
+
+ 0, 0, /* align */
+ 0x00, 0x02, 0x00, 0x00, /* handler */
+ 0x05, 0x06, 0x07, 0x08, /* data */
};
static const struct results results_0[] =
@@ -5323,7 +5326,7 @@ static void test_virtual_unwind(void)
{ 0x12, 0x10, 0, 0x5c, 0x060, TRUE, { {r4,0x50}, {r5,0x54}, {r6,0x58}, {lr,0x5c}, {d8, 0x1c00000018}, {d9, 0x2400000020}, {d10, 0x2c00000028}, {d3, 0x400000000}, {d4, 0xc00000008}, {d5, 0x1400000010}, {-1,-1} }},
{ 0x16, 0x10, 0, 0x74, 0x078, TRUE, { {r4,0x68}, {r5,0x6c}, {r6,0x70}, {lr,0x74}, {d8, 0x3400000030}, {d9, 0x3c00000038}, {d10, 0x4400000040}, {d3, 0x1c00000018}, {d4, 0x2400000020}, {d5, 0x2c00000028}, {d17, 0x400000000}, {d18, 0xc00000008}, {d19, 0x1400000010}, {-1,-1} }},
{ 0x1a, 0x10, 0, 0x80, 0x084, TRUE, { {r4,0x74}, {r5,0x78}, {r6,0x7c}, {lr,0x80}, {d8, 0x400000003c}, {d9, 0x4800000044}, {d10, 0x500000004c}, {d3, 0x2800000024}, {d4, 0x300000002c}, {d5, 0x3800000034}, {d17, 0x100000000c}, {d18, 0x1800000014}, {d19, 0x200000001c}, {r8,0x00}, {r10,0x04}, {r12,0x08}, {-1,-1} }},
- { 0x1c, 0x10, 0, 0x90, 0x094, TRUE, { {r4,0x84}, {r5,0x88}, {r6,0x8c}, {lr,0x90}, {d8, 0x500000004c}, {d9, 0x5800000054}, {d10, 0x600000005c}, {d3, 0x3800000034}, {d4, 0x400000003c}, {d5, 0x4800000044}, {d17, 0x200000001c}, {d18, 0x2800000024}, {d19, 0x300000002c}, {r8,0x10}, {r10,0x14}, {r12,0x18}, {-1,-1} }},
+ { 0x1c, 0x10, 1, 0x90, 0x094, TRUE, { {r4,0x84}, {r5,0x88}, {r6,0x8c}, {lr,0x90}, {d8, 0x500000004c}, {d9, 0x5800000054}, {d10, 0x600000005c}, {d3, 0x3800000034}, {d4, 0x400000003c}, {d5, 0x4800000044}, {d17, 0x200000001c}, {d18, 0x2800000024}, {d19, 0x300000002c}, {r8,0x10}, {r10,0x14}, {r12,0x18}, {-1,-1} }},
{ 0x1e, 0x10, 0, 0x3c, 0x040, TRUE, { {r4,0x30}, {r5,0x34}, {r6,0x38}, {lr,0x3c}, {d8, 0x400000000}, {d9, 0xc00000008}, {d10, 0x1400000010}, {-1,-1} }},
{ 0x22, 0x10, 0, 0x3c, 0x040, TRUE, { {r4,0x30}, {r5,0x34}, {r6,0x38}, {lr,0x3c}, {-1,-1} }},
{ 0x24, 0x10, 0, 0x2c, 0x030, TRUE, { {r4,0x20}, {r5,0x24}, {r6,0x28}, {lr,0x2c}, {-1,-1} }},
@@ -6818,7 +6821,6 @@ static void call_virtual_unwind( int testnum, const struct unwind_test *test )
&runtime_func, &context, &data, &frame, &ctx_ptr );
if (test->results[i].handler > 0)
{
- /* Yet untested */
ok( (char *)handler == (char *)code_mem + 0x200,
"%u/%u: wrong handler %p/%p\n", testnum, i, handler, (char *)code_mem + 0x200 );
if (handler) ok( *(DWORD *)data == 0x08070605,
@@ -6934,7 +6936,7 @@ static void test_virtual_unwind(void)
static const DWORD unwind_info_0_header =
(sizeof(function_0)/4) | /* function length */
- (0 << 20) | /* X */
+ (1 << 20) | /* X */
(0 << 21) | /* E */
(1 << 22) | /* epilog */
(2 << 27); /* codes */
@@ -6954,6 +6956,9 @@ static void test_virtual_unwind(void)
UWOP_SAVE_REGP(19, 16), /* stp x19, x20, [sp, #16] */
UWOP_ALLOC_SMALL(32), /* sub sp, sp, #32 */
UWOP_END,
+
+ 0x00, 0x02, 0x00, 0x00, /* handler */
+ 0x05, 0x06, 0x07, 0x08, /* data */
};
static const struct results results_0[] =
@@ -6961,7 +6966,7 @@ static void test_virtual_unwind(void)
/* offset fp handler pc frame offset registers */
{ 0x00, 0x00, 0, ORIG_LR, 0x000, TRUE, { {-1,-1} }},
{ 0x04, 0x00, 0, ORIG_LR, 0x020, TRUE, { {-1,-1} }},
- { 0x08, 0x00, 0, ORIG_LR, 0x020, TRUE, { {x19,0x10}, {x20,0x18}, {-1,-1} }},
+ { 0x08, 0x00, 1, ORIG_LR, 0x020, TRUE, { {x19,0x10}, {x20,0x18}, {-1,-1} }},
{ 0x0c, 0x00, 0, ORIG_LR, 0x020, TRUE, { {x19,0x10}, {x20,0x18}, {-1,-1} }},
{ 0x10, 0x00, 0, ORIG_LR, 0x020, TRUE, { {-1,-1} }},
{ 0x14, 0x00, 0, ORIG_LR, 0x000, TRUE, { {-1,-1} }},
--
GitLab
https://gitlab.winehq.org/wine/wine/-/merge_requests/214
June 9, 2022
[PATCH 1/2] ntdll: tests: Fix printing of incorrect exception handler data
by Martin Storsjö
From: Martin Storsjö <martin(a)martin.st>
*(DWORD *)data is the value being compared; printing the 'data'
pointer itself provides little value here.
Signed-off-by: Martin Storsjö <martin(a)martin.st>
---
dlls/ntdll/tests/exception.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/dlls/ntdll/tests/exception.c b/dlls/ntdll/tests/exception.c
index 3e76b001147..aa24ae1704f 100644
--- a/dlls/ntdll/tests/exception.c
+++ b/dlls/ntdll/tests/exception.c
@@ -2123,7 +2123,7 @@ static void call_virtual_unwind( int testnum, const struct unwind_test *test )
ok( handler == expected_handler || broken( test->broken_results && handler == broken_handler ),
"%u/%u: wrong handler %p/%p\n", testnum, i, handler, expected_handler );
if (handler)
- ok( *(DWORD *)data == 0x08070605, "%u/%u: wrong handler data %p\n", testnum, i, data );
+ ok( *(DWORD *)data == 0x08070605, "%u/%u: wrong handler data %p\n", testnum, i, *(DWORD *)data );
else
ok( data == (void *)0xdeadbeef, "%u/%u: handler data set to %p\n", testnum, i, data );
@@ -5144,7 +5144,7 @@ static void call_virtual_unwind( int testnum, const struct unwind_test *test )
ok( (char *)handler == (char *)code_mem + 0x200,
"%u/%u: wrong handler %p/%p\n", testnum, i, handler, (char *)code_mem + 0x200 );
if (handler) ok( *(DWORD *)data == 0x08070605,
- "%u/%u: wrong handler data %p\n", testnum, i, data );
+ "%u/%u: wrong handler data %p\n", testnum, i, *(DWORD *)data );
}
else
{
@@ -6822,7 +6822,7 @@ static void call_virtual_unwind( int testnum, const struct unwind_test *test )
ok( (char *)handler == (char *)code_mem + 0x200,
"%u/%u: wrong handler %p/%p\n", testnum, i, handler, (char *)code_mem + 0x200 );
if (handler) ok( *(DWORD *)data == 0x08070605,
- "%u/%u: wrong handler data %p\n", testnum, i, data );
+ "%u/%u: wrong handler data %p\n", testnum, i, *(DWORD *)data );
}
else
{
--
GitLab
https://gitlab.winehq.org/wine/wine/-/merge_requests/214
June 9, 2022
[PATCH 0/2] MR214: ntdll: tests: Test returning an exception handler on arm/arm64
by Martin Storsjö
Also fix up the error message printed for the handler data.
--
https://gitlab.winehq.org/wine/wine/-/merge_requests/214
June 9, 2022
Re: [PATCH 0/1] MR213: nls: Add some of the missing codepage files.
by Alexandre Julliard (@julliard)
You also need to add the codepage names in kernelbase/locale.c.
Are all these codepages actually needed by an application?
--
https://gitlab.winehq.org/wine/wine/-/merge_requests/213#note_1745
June 9, 2022
Re: [PATCH 6/7] d3d11: Create dxgi resource object for 3D textures.
by Marvin
Hi,
While running your changed tests, I think I found new failures.
Being a bot and all I'm not very good at pattern recognition, so I might be
wrong, but could you please double-check?
Full results can be found at:
https://testbot.winehq.org/JobDetails.pl?Key=116529
Your paranoid android.
=== w1064_tsign (32 bit report) ===
d3d11:
d3d11.c:5909: Test failed: Got unexpected query result 0x0000000000000000.
June 9, 2022
Re: [PATCH v2 1/3] dinput/tests: Avoid requiring foreground window in SetCooperativeLevel tests.
by Marvin
Hi,
While running your changed tests, I think I found new failures.
Being a bot and all I'm not very good at pattern recognition, so I might be
wrong, but could you please double-check?
Full results can be found at:
https://testbot.winehq.org/JobDetails.pl?Key=116536
Your paranoid android.
=== w7u_el (32 bit report) ===
dinput:
joystick8.c:3627: Test failed: got szPname L"\03a0\03c1. \03bf\03b4\03ae\03b3. Microsoft PC-joystick"
joystick8.c:1031: Test failed: 0x800: got DIPROP_KEYNAME L"\0386\03be\03bf\03bd\03b1\03c2 X"
June 9, 2022
[PATCH v2 3/3] dinput/tests: Merge device.c tests into device8.c.
by Rémi Bernon
From: Rémi Bernon <rbernon(a)codeweavers.com>
Signed-off-by: Rémi Bernon <rbernon(a)codeweavers.com>
---
dlls/dinput/tests/Makefile.in | 1 -
dlls/dinput/tests/device.c | 533 ----------------------------------
dlls/dinput/tests/device8.c | 372 +++++++++++++++++++++++-
3 files changed, 361 insertions(+), 545 deletions(-)
delete mode 100644 dlls/dinput/tests/device.c
diff --git a/dlls/dinput/tests/Makefile.in b/dlls/dinput/tests/Makefile.in
index 73d8a2fc2a6..1556f3cda37 100644
--- a/dlls/dinput/tests/Makefile.in
+++ b/dlls/dinput/tests/Makefile.in
@@ -9,7 +9,6 @@ driver_hid_poll_IMPORTS = winecrt0 ntoskrnl hal hidclass
driver_hid_poll_EXTRADLLFLAGS = -nodefaultlibs -nostartfiles -Wl,--subsystem,native
SOURCES = \
- device.c \
device8.c \
dinput.c \
driver_bus.c \
diff --git a/dlls/dinput/tests/device.c b/dlls/dinput/tests/device.c
deleted file mode 100644
index 6e1e94ba9c2..00000000000
--- a/dlls/dinput/tests/device.c
+++ /dev/null
@@ -1,533 +0,0 @@
-/*
- * Copyright (c) 2006 Vitaliy Margolen
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
- */
-
-#define DIRECTINPUT_VERSION 0x0700
-
-#include <stdarg.h>
-#include <stddef.h>
-#include <limits.h>
-
-#include "ntstatus.h"
-#define WIN32_NO_STATUS
-#include "windef.h"
-#include "winbase.h"
-
-#define COBJMACROS
-#include "dinput.h"
-
-#include "dinput_test.h"
-
-static const DIOBJECTDATAFORMAT obj_data_format[] = {
- { &GUID_YAxis, 16, DIDFT_OPTIONAL|DIDFT_AXIS |DIDFT_MAKEINSTANCE(1), 0},
- { &GUID_Button,15, DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(3), 0},
- { &GUID_Key, 0, DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(16),0},
- { &GUID_Key, 1, DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(17),0},
- { &GUID_Key, 2, DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(18),0},
- { &GUID_Key, 3, DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(19),0},
- { &GUID_Key, 4, DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(20),0},
- { &GUID_Key, 5, DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(21),0},
- { &GUID_Key, 6, DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(22),0},
- { &GUID_Key, 7, DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(23),0},
- { &GUID_Key, 8, DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(24),0},
- { &GUID_Key, 9, DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(25),0},
- { &GUID_Key, 10, DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(26),0},
- { &GUID_Key, 11, DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(27),0},
- { &GUID_Key, 12, DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(28),0},
- { NULL, 13, DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(5),0},
-
- { &GUID_Button,14, DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(32),0}
-};
-
-static const DIDATAFORMAT data_format = {
- sizeof(DIDATAFORMAT),
- sizeof(DIOBJECTDATAFORMAT),
- DIDF_ABSAXIS,
- 32,
- ARRAY_SIZE(obj_data_format),
- (LPDIOBJECTDATAFORMAT)obj_data_format
-};
-
-static BOOL CALLBACK enum_callback(const DIDEVICEOBJECTINSTANCEA *oi, void *info)
-{
- if (winetest_debug > 1)
- trace(" Type:%#lx Ofs:%3ld Flags:%#lx Name:%s\n",
- oi->dwType, oi->dwOfs, oi->dwFlags, oi->tszName);
- (*(int*)info)++;
- return DIENUM_CONTINUE;
-}
-
-static BOOL CALLBACK enum_type_callback(const DIDEVICEOBJECTINSTANCEA *oi, void *info)
-{
- DWORD expected = *(DWORD*)info;
- ok (expected & DIDFT_GETTYPE(oi->dwType), "EnumObjects() enumerated wrong type for obj %s, expected: %#lx got: %#lx\n", oi->tszName, expected, oi->dwType);
- return DIENUM_CONTINUE;
-}
-
-static void test_object_info(IDirectInputDeviceA *device, HWND hwnd)
-{
- HRESULT hr;
- DIPROPDWORD dp;
- DIDEVICEOBJECTINSTANCEA obj_info;
- DWORD obj_types[] = {DIDFT_BUTTON, DIDFT_AXIS, DIDFT_POV};
- int type_index;
- int cnt1 = 0;
- DWORD cnt = 0;
- DIDEVICEOBJECTDATA buffer[5];
-
- hr = IDirectInputDevice_EnumObjects(device, NULL, &cnt, DIDFT_ALL);
- ok(hr == DIERR_INVALIDPARAM, "IDirectInputDevice_EnumObjects returned %#lx, expected %#lx\n", hr, DIERR_INVALIDPARAM);
-
- hr = IDirectInputDevice_EnumObjects(device, enum_callback, &cnt, DIDFT_ALL);
- ok(SUCCEEDED(hr), "EnumObjects() failed: %#lx\n", hr);
-
- hr = IDirectInputDevice_SetDataFormat(device, &data_format);
- ok(SUCCEEDED(hr), "SetDataFormat() failed: %#lx\n", hr);
-
- hr = IDirectInputDevice_EnumObjects(device, enum_callback, &cnt1, DIDFT_ALL);
- ok(SUCCEEDED(hr), "EnumObjects() failed: %#lx\n", hr);
- if (0) /* fails for joystick only */
- ok(cnt == cnt1, "Enum count changed from %lu to %u\n", cnt, cnt1);
-
- /* Testing EnumObjects with different types of device objects */
- for (type_index=0; type_index < ARRAY_SIZE(obj_types); type_index++)
- {
- hr = IDirectInputDevice_EnumObjects(device, enum_type_callback, &obj_types[type_index], obj_types[type_index]);
- ok(SUCCEEDED(hr), "EnumObjects() failed: %#lx\n", hr);
- }
-
- /* Test buffered mode */
- memset(&dp, 0, sizeof(dp));
- dp.diph.dwSize = sizeof(DIPROPDWORD);
- dp.diph.dwHeaderSize = sizeof(DIPROPHEADER);
- dp.diph.dwHow = DIPH_DEVICE;
- dp.diph.dwObj = 0;
- dp.dwData = UINT_MAX;
-
- hr = IDirectInputDevice_GetProperty(device, DIPROP_BUFFERSIZE, &dp.diph);
- ok(hr == DI_OK, "Failed: %#lx\n", hr);
- ok(dp.dwData == 0, "got %ld\n", dp.dwData);
-
- dp.dwData = UINT_MAX;
- hr = IDirectInputDevice_SetProperty(device, DIPROP_BUFFERSIZE, (LPCDIPROPHEADER)&dp.diph);
- ok(hr == DI_OK, "SetProperty() failed: %#lx\n", hr);
-
- dp.dwData = 0;
- hr = IDirectInputDevice_GetProperty(device, DIPROP_BUFFERSIZE, &dp.diph);
- ok(hr == DI_OK, "Failed: %#lx\n", hr);
- ok(dp.dwData == UINT_MAX, "got %ld\n", dp.dwData);
-
- dp.dwData = 0;
- hr = IDirectInputDevice_SetProperty(device, DIPROP_BUFFERSIZE, (LPCDIPROPHEADER)&dp.diph);
- ok(hr == DI_OK, "SetProperty() failed: %#lx\n", hr);
- cnt = 5;
- hr = IDirectInputDevice_GetDeviceData(device, sizeof(buffer[0]), buffer, &cnt, 0);
- ok(hr == DI_OK && cnt == 5, "GetDeviceData() failed: %#lx cnt: %ld\n", hr, cnt);
- hr = IDirectInputDevice_GetDeviceData(device, sizeof(DIDEVICEOBJECTDATA_DX3), buffer, &cnt, 0);
- ok(hr == DIERR_NOTBUFFERED, "GetDeviceData() should have failed: %#lx\n", hr);
- IDirectInputDevice_Acquire(device);
- hr = IDirectInputDevice_GetDeviceData(device, sizeof(DIDEVICEOBJECTDATA_DX3), buffer, &cnt, 0);
- ok(hr == DIERR_NOTBUFFERED, "GetDeviceData() should have failed: %#lx\n", hr);
- IDirectInputDevice_Unacquire(device);
-
- dp.dwData = 20;
- hr = IDirectInputDevice_SetProperty(device, DIPROP_BUFFERSIZE, (LPCDIPROPHEADER)&dp.diph);
- ok(hr == DI_OK, "SetProperty() failed: %#lx\n", hr);
- cnt = 5;
- hr = IDirectInputDevice_GetDeviceData(device, sizeof(buffer[0]), buffer, &cnt, 0);
- ok(hr == DI_OK, "GetDeviceData() failed: %#lx\n", hr);
- hr = IDirectInputDevice_GetDeviceData(device, sizeof(DIDEVICEOBJECTDATA_DX3), buffer, &cnt, 0);
- ok(hr == DIERR_NOTACQUIRED, "GetDeviceData() should have failed: %#lx\n", hr);
- hr = IDirectInputDevice_Acquire(device);
- ok(hr == DI_OK, "Acquire() failed: %#lx\n", hr);
- cnt = 1;
- hr = IDirectInputDevice_GetDeviceData(device, sizeof(buffer[0]), buffer, &cnt, 0);
- ok(hr == DI_OK, "GetDeviceData() failed: %#lx\n", hr);
- hr = IDirectInputDevice_Unacquire(device);
- ok(hr == DI_OK, "Unacquire() failed: %#lx\n", hr);
- cnt = 1;
- hr = IDirectInputDevice_GetDeviceData(device, sizeof(buffer[0]), buffer, &cnt, 0);
- ok(hr == DI_OK, "GetDeviceData() failed: %#lx\n", hr);
-
- hr = IDirectInputDevice_GetObjectInfo(device, NULL, 16, DIPH_BYOFFSET);
- ok(hr == E_POINTER, "IDirectInputDevice_GetObjectInfo returned %#lx, expected %#lx\n", hr, E_POINTER);
-
- obj_info.dwSize = 1;
- hr = IDirectInputDevice_GetObjectInfo(device, &obj_info, 16, DIPH_BYOFFSET);
- ok(hr == DIERR_INVALIDPARAM, "IDirectInputDevice_GetObjectInfo returned %#lx, expected %#lx\n", hr, DIERR_INVALIDPARAM);
- obj_info.dwSize = 0xdeadbeef;
- hr = IDirectInputDevice_GetObjectInfo(device, &obj_info, 16, DIPH_BYOFFSET);
- ok(hr == DIERR_INVALIDPARAM, "IDirectInputDevice_GetObjectInfo returned %#lx, expected %#lx\n", hr, DIERR_INVALIDPARAM);
-
- /* No need to test devices without axis */
- obj_info.dwSize = sizeof(obj_info);
- hr = IDirectInputDevice_GetObjectInfo(device, &obj_info, 16, DIPH_BYOFFSET);
- if (SUCCEEDED(hr))
- {
- /* No device supports per axis relative/absolute mode */
- dp.diph.dwHow = DIPH_BYOFFSET;
- dp.diph.dwObj = 16;
- dp.dwData = DIPROPAXISMODE_ABS;
- hr = IDirectInputDevice_SetProperty(device, DIPROP_AXISMODE, &dp.diph);
- ok(hr == DIERR_UNSUPPORTED, "SetProperty() returned: %#lx\n", hr);
- dp.diph.dwHow = DIPH_DEVICE;
- hr = IDirectInputDevice_SetProperty(device, DIPROP_AXISMODE, &dp.diph);
- ok(hr == DIERR_INVALIDPARAM, "SetProperty() returned: %#lx\n", hr);
- dp.diph.dwObj = 0;
- hr = IDirectInputDevice_SetProperty(device, DIPROP_AXISMODE, &dp.diph);
- ok(hr == DI_OK, "SetProperty() failed: %#lx\n", hr);
-
- /* Cannot change mode while acquired */
- hr = IDirectInputDevice_Acquire(device);
- ok(hr == DI_OK, "Acquire() failed: %#lx\n", hr);
-
- hr = IDirectInputDevice_SetProperty(device, DIPROP_AXISMODE, &dp.diph);
- ok(hr == DIERR_ACQUIRED, "SetProperty() returned: %#lx\n", hr);
- hr = IDirectInputDevice_Unacquire(device);
- ok(hr == DI_OK, "Unacquire() failed: %#lx\n", hr);
- }
-
- /* Reset buffer size */
- dp.diph.dwSize = sizeof(DIPROPDWORD);
- dp.diph.dwHeaderSize = sizeof(DIPROPHEADER);
- dp.diph.dwHow = DIPH_DEVICE;
- dp.diph.dwObj = 0;
- dp.dwData = 0;
- hr = IDirectInputDevice_SetProperty(device, DIPROP_BUFFERSIZE, (LPCDIPROPHEADER)&dp.diph);
- ok(hr == DI_OK, "SetProperty() failed: %#lx\n", hr);
-}
-
-struct enum_data
-{
- IDirectInputA *pDI;
- HWND hwnd;
- BOOL tested_product_creation;
-};
-
-static BOOL CALLBACK enum_devices(const DIDEVICEINSTANCEA *lpddi, void *pvRef)
-{
- struct enum_data *data = pvRef;
- IDirectInputDeviceA *device, *obj = NULL;
- DIDEVICEINSTANCEA ddi2;
- HRESULT hr;
- IUnknown *iface, *tmp_iface;
-
- hr = IDirectInput_GetDeviceStatus(data->pDI, &lpddi->guidInstance);
- ok(hr == DI_OK, "IDirectInput_GetDeviceStatus() failed: %#lx\n", hr);
-
- if (hr == DI_OK)
- {
- hr = IDirectInput_CreateDevice(data->pDI, &lpddi->guidInstance, &device, NULL);
- ok(SUCCEEDED(hr), "IDirectInput_CreateDevice() failed: %#lx\n", hr);
- trace("Testing device %p \"%s\"\n", device, lpddi->tszInstanceName);
-
- hr = IUnknown_QueryInterface(device, &IID_IDirectInputDevice2A, (LPVOID*)&obj);
- ok(SUCCEEDED(hr), "IUnknown_QueryInterface(IID_IDirectInputDevice2A) failed: %#lx\n", hr);
- test_object_info(obj, data->hwnd);
- IUnknown_Release(obj);
- obj = NULL;
-
- hr = IUnknown_QueryInterface(device, &IID_IDirectInputDevice2W, (LPVOID*)&obj);
- ok(SUCCEEDED(hr), "IUnknown_QueryInterface(IID_IDirectInputDevice2W) failed: %#lx\n", hr);
- test_object_info(obj, data->hwnd);
- IUnknown_Release(obj);
-
- hr = IUnknown_QueryInterface( device, &IID_IDirectInputDeviceA, (void **)&iface );
- ok( SUCCEEDED(hr), "IUnknown_QueryInterface(IID_IDirectInputDeviceA) failed: %#lx\n", hr );
- hr = IUnknown_QueryInterface( device, &IID_IDirectInputDevice2A, (void **)&tmp_iface );
- ok( SUCCEEDED(hr), "IUnknown_QueryInterface(IID_IDirectInputDevice2A) failed: %#lx\n", hr );
- ok( tmp_iface == iface, "IDirectInputDevice2A iface differs from IDirectInputDeviceA\n" );
- IUnknown_Release( tmp_iface );
- hr = IUnknown_QueryInterface( device, &IID_IDirectInputDevice7A, (void **)&tmp_iface );
- ok( SUCCEEDED(hr), "IUnknown_QueryInterface(IID_IDirectInputDevice7A) failed: %#lx\n", hr );
- ok( tmp_iface == iface, "IDirectInputDevice7A iface differs from IDirectInputDeviceA\n" );
- IUnknown_Release( tmp_iface );
- IUnknown_Release( iface );
-
- hr = IUnknown_QueryInterface( device, &IID_IUnknown, (void **)&iface );
- ok( SUCCEEDED(hr), "IUnknown_QueryInterface(IID_IUnknown) failed: %#lx\n", hr );
- hr = IUnknown_QueryInterface( device, &IID_IDirectInputDeviceW, (void **)&tmp_iface );
- ok( SUCCEEDED(hr), "IUnknown_QueryInterface(IID_IDirectInputDeviceW) failed: %#lx\n", hr );
- ok( tmp_iface == iface, "IDirectInputDeviceW iface differs from IUnknown\n" );
- IUnknown_Release( tmp_iface );
- hr = IUnknown_QueryInterface( device, &IID_IDirectInputDevice2W, (void **)&tmp_iface );
- ok( SUCCEEDED(hr), "IUnknown_QueryInterface(IID_IDirectInputDevice2W) failed: %#lx\n", hr );
- ok( tmp_iface == iface, "IDirectInputDevice2W iface differs from IUnknown\n" );
- IUnknown_Release( tmp_iface );
- hr = IUnknown_QueryInterface( device, &IID_IDirectInputDevice7W, (void **)&tmp_iface );
- ok( SUCCEEDED(hr), "IUnknown_QueryInterface(IID_IDirectInputDevice7W) failed: %#lx\n", hr );
- ok( tmp_iface == iface, "IDirectInputDevice7W iface differs from IUnknown\n" );
- IUnknown_Release( tmp_iface );
- IUnknown_Release( iface );
-
- IUnknown_Release(device);
-
- if (!IsEqualGUID(&lpddi->guidInstance, &lpddi->guidProduct))
- {
- data->tested_product_creation = TRUE;
- hr = IDirectInput_CreateDevice(data->pDI, &lpddi->guidProduct, &device, NULL);
- ok(SUCCEEDED(hr), "IDirectInput_CreateDevice() failed: %#lx\n", hr);
-
- ddi2.dwSize = sizeof(ddi2);
- hr = IDirectInputDevice_GetDeviceInfo(device, &ddi2);
- ok(SUCCEEDED(hr), "IDirectInput_GetDeviceInfo failed: %#lx\n", hr);
-
- ok(IsEqualGUID(&lpddi->guidProduct, &ddi2.guidProduct), "Product GUIDs do not match. Expected %s, got %s\n", debugstr_guid(&lpddi->guidProduct), debugstr_guid(&ddi2.guidProduct));
- ok(IsEqualGUID(&ddi2.guidProduct, &ddi2.guidInstance), "Instance GUID should equal product GUID. Expected %s, got %s\n", debugstr_guid(&ddi2.guidProduct), debugstr_guid(&ddi2.guidInstance));
- /* we cannot compare guidInstances as we may get a different device */
-
- IUnknown_Release(device);
- }
-
- }
- return DIENUM_CONTINUE;
-}
-
-struct overlapped_state
-{
- BYTE keys[4];
- DWORD extra_element;
-};
-
-static const DIOBJECTDATAFORMAT obj_overlapped_slider_format[] = {
- { &GUID_Key, 0, DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(DIK_A),0},
- { &GUID_Key, 1, DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(DIK_S),0},
- { &GUID_Key, 2, DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(DIK_D),0},
- { &GUID_Key, 3, DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(DIK_F),0},
- { &GUID_Slider, 0, DIDFT_OPTIONAL|DIDFT_AXIS|DIDFT_ANYINSTANCE,DIDOI_ASPECTPOSITION},
-};
-
-static const DIDATAFORMAT overlapped_slider_format = {
- sizeof(DIDATAFORMAT),
- sizeof(DIOBJECTDATAFORMAT),
- DIDF_ABSAXIS,
- sizeof(struct overlapped_state),
- ARRAY_SIZE(obj_overlapped_slider_format),
- (LPDIOBJECTDATAFORMAT)obj_overlapped_slider_format
-};
-
-static const DIOBJECTDATAFORMAT obj_overlapped_pov_format[] = {
- { &GUID_Key, 0, DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(DIK_A),0},
- { &GUID_Key, 1, DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(DIK_S),0},
- { &GUID_Key, 2, DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(DIK_D),0},
- { &GUID_Key, 3, DIDFT_OPTIONAL|DIDFT_BUTTON|DIDFT_MAKEINSTANCE(DIK_F),0},
- { &GUID_POV, 0, DIDFT_OPTIONAL|DIDFT_POV|DIDFT_ANYINSTANCE,0},
-};
-
-static const DIDATAFORMAT overlapped_pov_format = {
- sizeof(DIDATAFORMAT),
- sizeof(DIOBJECTDATAFORMAT),
- DIDF_ABSAXIS,
- sizeof(struct overlapped_state),
- ARRAY_SIZE(obj_overlapped_pov_format),
- (LPDIOBJECTDATAFORMAT)obj_overlapped_pov_format
-};
-
-static void pump_messages(void)
-{
- MSG msg;
-
- while (PeekMessageA(&msg, 0, 0, 0, PM_REMOVE))
- {
- TranslateMessage(&msg);
- DispatchMessageA(&msg);
- }
-}
-
-#define wait_for_device_data_and_discard(device) wait_for_device_data_and_discard_(__LINE__, device)
-static BOOL wait_for_device_data_and_discard_(int line, IDirectInputDeviceA *device)
-{
- DWORD cnt;
- HRESULT hr;
- DWORD start_time;
-
- pump_messages();
-
- start_time = GetTickCount();
- do
- {
- cnt = 10;
- hr = IDirectInputDevice_GetDeviceData(device, sizeof(DIDEVICEOBJECTDATA_DX3), NULL, &cnt, 0);
- ok_(__FILE__, line)(SUCCEEDED(hr), "IDirectInputDevice_GetDeviceData() failed: %#lx\n", hr);
- ok_(__FILE__, line)(cnt == 0 || cnt == 1, "Unexpected number of events: %lu\n", cnt);
- } while (cnt != 1 && (GetTickCount() - start_time < 500));
-
- return cnt == 1;
-}
-
-#define acquire_and_wait(device, valid_dik) acquire_and_wait_(__LINE__, device, valid_dik)
-static void acquire_and_wait_(int line, IDirectInputDeviceA *device, DWORD valid_dik)
-{
- HRESULT hr;
- int tries = 2;
-
- hr = IDirectInputDevice_Acquire(device);
- ok(SUCCEEDED(hr), "IDirectInputDevice_Acquire() failed: %#lx\n", hr);
-
- do
- {
- keybd_event(0, valid_dik, KEYEVENTF_SCANCODE, 0);
- } while (!wait_for_device_data_and_discard(device) && tries--);
-
- keybd_event(0, valid_dik, KEYEVENTF_SCANCODE|KEYEVENTF_KEYUP, 0);
- ok_(__FILE__, line)(wait_for_device_data_and_discard(device),
- "Timed out while waiting for injected events to be picked up by DirectInput.\n");
-}
-
-void overlapped_format_tests(IDirectInputA *pDI, HWND hwnd)
-{
- HRESULT hr;
- struct overlapped_state state;
- IDirectInputDeviceA *keyboard = NULL;
- DIPROPDWORD dp;
-
- SetFocus(hwnd);
-
- hr = IDirectInput_CreateDevice(pDI, &GUID_SysKeyboard, &keyboard, NULL);
- ok(SUCCEEDED(hr), "IDirectInput_CreateDevice() failed: %#lx\n", hr);
-
- /* test overlapped slider - default value 0 */
- hr = IDirectInputDevice_SetDataFormat(keyboard, &overlapped_slider_format);
- ok(SUCCEEDED(hr), "IDirectInputDevice_SetDataFormat() failed: %#lx\n", hr);
-
- dp.diph.dwSize = sizeof(DIPROPDWORD);
- dp.diph.dwHeaderSize = sizeof(DIPROPHEADER);
- dp.diph.dwHow = DIPH_DEVICE;
- dp.diph.dwObj = 0;
- dp.dwData = 10;
- hr = IDirectInputDevice_SetProperty(keyboard, DIPROP_BUFFERSIZE, &dp.diph);
- ok(SUCCEEDED(hr), "IDirectInputDevice_SetProperty() failed: %#lx\n", hr);
-
- acquire_and_wait(keyboard, DIK_F);
-
- /* press D */
- keybd_event(0, DIK_D, KEYEVENTF_SCANCODE, 0);
- ok(wait_for_device_data_and_discard(keyboard),
- "Timed out while waiting for injected events to be picked up by DirectInput.\n");
-
- memset(&state, 0xFF, sizeof(state));
- hr = IDirectInputDevice_GetDeviceState(keyboard, sizeof(state), &state);
- ok(SUCCEEDED(hr), "IDirectInputDevice_GetDeviceState() failed: %#lx\n", hr);
-
- ok(state.keys[0] == 0x00, "key A should be still up\n");
- ok(state.keys[1] == 0x00, "key S should be still up\n");
- ok(state.keys[2] == 0x80, "keydown for D did not register\n");
- ok(state.keys[3] == 0x00, "key F should be still up\n");
- ok(state.extra_element == 0, "State struct was not memset to zero\n");
-
- /* release D */
- keybd_event(0, DIK_D, KEYEVENTF_SCANCODE|KEYEVENTF_KEYUP, 0);
- ok(wait_for_device_data_and_discard(keyboard),
- "Timed out while waiting for injected events to be picked up by DirectInput.\n");
-
- hr = IDirectInputDevice_Unacquire(keyboard);
- ok(SUCCEEDED(hr), "IDirectInputDevice_Unacquire() failed: %#lx\n", hr);
-
- /* test overlapped pov - default value - 0xFFFFFFFF */
- hr = IDirectInputDevice_SetDataFormat(keyboard, &overlapped_pov_format);
- ok(SUCCEEDED(hr), "IDirectInputDevice_SetDataFormat() failed: %#lx\n", hr);
-
- acquire_and_wait(keyboard, DIK_F);
-
- /* press D */
- keybd_event(0, DIK_D, KEYEVENTF_SCANCODE, 0);
- ok(wait_for_device_data_and_discard(keyboard),
- "Timed out while waiting for injected events to be picked up by DirectInput.\n");
-
- memset(&state, 0xFF, sizeof(state));
- hr = IDirectInputDevice_GetDeviceState(keyboard, sizeof(state), &state);
- ok(SUCCEEDED(hr), "IDirectInputDevice_GetDeviceState() failed: %#lx\n", hr);
-
- ok(state.keys[0] == 0xFF, "key state should have been overwritten by the overlapped POV\n");
- ok(state.keys[1] == 0xFF, "key state should have been overwritten by the overlapped POV\n");
- ok(state.keys[2] == 0xFF, "key state should have been overwritten by the overlapped POV\n");
- ok(state.keys[3] == 0xFF, "key state should have been overwritten by the overlapped POV\n");
- ok(state.extra_element == 0, "State struct was not memset to zero\n");
-
- /* release D */
- keybd_event(0, DIK_D, KEYEVENTF_SCANCODE|KEYEVENTF_KEYUP, 0);
- ok(wait_for_device_data_and_discard(keyboard),
- "Timed out while waiting for injected events to be picked up by DirectInput.\n");
-
- if (keyboard) IUnknown_Release(keyboard);
-}
-
-static void device_tests(void)
-{
- HRESULT hr;
- IDirectInputA *pDI = NULL, *obj = NULL;
- HWND hwnd;
- struct enum_data data;
-
- hr = CoCreateInstance(&CLSID_DirectInput, 0, 1, &IID_IDirectInput2A, (LPVOID*)&pDI);
- if (hr == DIERR_OLDDIRECTINPUTVERSION || hr == DIERR_DEVICENOTREG)
- {
- skip("Tests require a newer dinput version\n");
- return;
- }
- ok(SUCCEEDED(hr), "DirectInputCreateA() failed: %#lx\n", hr);
- if (FAILED(hr)) return;
-
- hr = IDirectInput_Initialize(pDI, instance, DIRECTINPUT_VERSION);
- ok(SUCCEEDED(hr), "Initialize() failed: %#lx\n", hr);
- if (FAILED(hr)) return;
-
- hr = IUnknown_QueryInterface(pDI, &IID_IDirectInput2W, (LPVOID*)&obj);
- ok(SUCCEEDED(hr), "QueryInterface(IDirectInput7W) failed: %#lx\n", hr);
-
- hwnd = CreateWindowA("static", "Title", WS_OVERLAPPEDWINDOW, 10, 10, 200, 200, NULL, NULL,
- NULL, NULL);
- ok(hwnd != NULL, "err: %ld\n", GetLastError());
- if (hwnd)
- {
- ShowWindow(hwnd, SW_SHOW);
-
- data.pDI = pDI;
- data.hwnd = hwnd;
- data.tested_product_creation = FALSE;
- hr = IDirectInput_EnumDevices(pDI, 0, enum_devices, &data, DIEDFL_ALLDEVICES);
- ok(SUCCEEDED(hr), "IDirectInput_EnumDevices() failed: %#lx\n", hr);
-
- if (!data.tested_product_creation) winetest_skip("Device creation using product GUID not tested\n");
-
- /* If GetDeviceStatus returns DI_OK the device must exist */
- hr = IDirectInput_GetDeviceStatus(pDI, &GUID_Joystick);
- if (hr == DI_OK)
- {
- IDirectInputDeviceA *device = NULL;
-
- hr = IDirectInput_CreateDevice(pDI, &GUID_Joystick, &device, NULL);
- ok(SUCCEEDED(hr), "IDirectInput_CreateDevice() failed: %#lx\n", hr);
- if (device) IUnknown_Release(device);
- }
-
- overlapped_format_tests(pDI, hwnd);
-
- DestroyWindow(hwnd);
- }
- if (obj) IUnknown_Release(obj);
- if (pDI) IUnknown_Release(pDI);
-}
-
-START_TEST(device)
-{
- dinput_test_init();
-
- device_tests();
-
- dinput_test_exit();
-}
diff --git a/dlls/dinput/tests/device8.c b/dlls/dinput/tests/device8.c
index 70c3e516f17..7bd3600df61 100644
--- a/dlls/dinput/tests/device8.c
+++ b/dlls/dinput/tests/device8.c
@@ -21,6 +21,7 @@
#include <stdarg.h>
#include <stddef.h>
+#include <limits.h>
#include "ntstatus.h"
#define WIN32_NO_STATUS
@@ -33,13 +34,20 @@
#include "dinput_test.h"
-struct enum_data {
- IDirectInput8A *pDI;
+struct enum_data
+{
+ DWORD version;
+ union
+ {
+ IDirectInput8A *dinput8;
+ IDirectInputA *dinput;
+ };
DIACTIONFORMATA *lpdiaf;
IDirectInputDevice8A *keyboard;
IDirectInputDevice8A *mouse;
- const char* username;
+ const char *username;
int ndevices;
+ HWND hwnd;
};
/* Dummy GUID */
@@ -74,19 +82,343 @@ static DIACTIONA actionMapping[]=
static void flush_events(void)
{
- int diff = 200;
- int min_timeout = 100;
+ int min_timeout = 100, diff = 200;
DWORD time = GetTickCount() + diff;
+ MSG msg;
while (diff > 0)
{
- if (MsgWaitForMultipleObjects(0, NULL, FALSE, min_timeout, QS_ALLINPUT) == WAIT_TIMEOUT)
- break;
+ if (MsgWaitForMultipleObjects( 0, NULL, FALSE, min_timeout, QS_ALLINPUT ) == WAIT_TIMEOUT) break;
+ while (PeekMessageA( &msg, 0, 0, 0, PM_REMOVE ))
+ {
+ TranslateMessage( &msg );
+ DispatchMessageA( &msg );
+ }
diff = time - GetTickCount();
- min_timeout = 50;
}
}
+static HRESULT direct_input_create( DWORD version, IDirectInputA **out )
+{
+ HRESULT hr;
+ if (version < 0x800) hr = DirectInputCreateA( instance, version, out, NULL );
+ else hr = DirectInput8Create( instance, version, &IID_IDirectInput8A, (void **)out, NULL );
+ if (FAILED(hr)) win_skip( "Failed to instantiate a IDirectInput instance, hr %#lx\n", hr );
+ return hr;
+}
+
+#define check_interface( a, b, c ) check_interface_( __LINE__, a, b, c )
+static void check_interface_( unsigned int line, void *iface_ptr, REFIID iid, BOOL supported )
+{
+ IUnknown *iface = iface_ptr;
+ HRESULT hr, expected;
+ IUnknown *unk;
+
+ expected = supported ? S_OK : E_NOINTERFACE;
+ hr = IUnknown_QueryInterface( iface, iid, (void **)&unk );
+ ok_(__FILE__, line)( hr == expected, "got hr %#lx, expected %#lx.\n", hr, expected );
+ if (SUCCEEDED(hr)) IUnknown_Release( unk );
+}
+
+static BOOL CALLBACK check_device_query_interface( const DIDEVICEINSTANCEA *instance, void *context )
+{
+ struct enum_data *data = context;
+ IUnknown *device;
+ HRESULT hr;
+ LONG ref;
+
+ if (data->version < 0x800)
+ {
+ hr = IDirectInput_GetDeviceStatus( data->dinput, &instance->guidInstance );
+ ok( hr == DI_OK, "GetDeviceStatus returned %#lx\n", hr );
+ hr = IDirectInput_GetDeviceStatus( data->dinput, &instance->guidProduct );
+ ok( hr == DI_OK, "GetDeviceStatus returned %#lx\n", hr );
+
+ hr = IDirectInput_CreateDevice( data->dinput, &instance->guidProduct, (IDirectInputDeviceA **)&device, NULL );
+ ok( hr == DI_OK, "CreateDevice returned %#lx\n", hr );
+ ref = IUnknown_Release( device );
+ ok( ref == 0, "Release returned %ld\n", ref );
+
+ hr = IDirectInput_CreateDevice( data->dinput, &instance->guidInstance, (IDirectInputDeviceA **)&device, NULL );
+ ok( hr == DI_OK, "CreateDevice returned %#lx\n", hr );
+ }
+ else
+ {
+ hr = IDirectInput8_GetDeviceStatus( data->dinput8, &instance->guidInstance );
+ ok( hr == DI_OK, "GetDeviceStatus returned %#lx\n", hr );
+ hr = IDirectInput8_GetDeviceStatus( data->dinput8, &instance->guidProduct );
+ ok( hr == DI_OK, "GetDeviceStatus returned %#lx\n", hr );
+
+ hr = IDirectInput8_CreateDevice( data->dinput8, &instance->guidProduct, (IDirectInputDevice8A **)&device, NULL );
+ ok( hr == DI_OK, "CreateDevice returned %#lx\n", hr );
+ ref = IUnknown_Release( device );
+ ok( ref == 0, "Release returned %ld\n", ref );
+
+ hr = IDirectInput8_CreateDevice( data->dinput8, &instance->guidInstance, (IDirectInputDevice8A **)&device, NULL );
+ ok( hr == DI_OK, "CreateDevice returned %#lx\n", hr );
+ }
+
+ todo_wine_if( data->version >= 0x800 )
+ check_interface( device, &IID_IDirectInputDeviceA, data->version < 0x800 );
+ todo_wine_if( data->version >= 0x800 )
+ check_interface( device, &IID_IDirectInputDevice2A, data->version < 0x800 );
+ todo_wine_if( data->version >= 0x800 )
+ check_interface( device, &IID_IDirectInputDevice7A, data->version < 0x800 );
+ todo_wine_if( data->version < 0x800 )
+ check_interface( device, &IID_IDirectInputDevice8A, data->version >= 0x800 );
+
+ todo_wine_if( data->version >= 0x800 )
+ check_interface( device, &IID_IDirectInputDeviceW, data->version < 0x800 );
+ todo_wine_if( data->version >= 0x800 )
+ check_interface( device, &IID_IDirectInputDevice2W, data->version < 0x800 );
+ todo_wine_if( data->version >= 0x800 )
+ check_interface( device, &IID_IDirectInputDevice7W, data->version < 0x800 );
+ todo_wine_if( data->version < 0x800 )
+ check_interface( device, &IID_IDirectInputDevice8W, data->version >= 0x800 );
+
+ ref = IUnknown_Release( device );
+ ok( ref == 0, "Release returned %ld\n", ref );
+
+ return DIENUM_CONTINUE;
+}
+
+static void test_QueryInterface( DWORD version )
+{
+ struct enum_data data = {.version = version};
+ HRESULT hr;
+ ULONG ref;
+
+ if (FAILED(hr = direct_input_create( version, &data.dinput ))) return;
+
+ winetest_push_context( "%#lx", version );
+
+ if (version < 0x800)
+ {
+ hr = IDirectInput_EnumDevices( data.dinput, 0, check_device_query_interface, &data, DIEDFL_ALLDEVICES );
+ ok( hr == DI_OK, "EnumDevices returned %#lx\n", hr );
+ }
+ else
+ {
+ hr = IDirectInput8_EnumDevices( data.dinput8, 0, check_device_query_interface, &data, DIEDFL_ALLDEVICES );
+ ok( hr == DI_OK, "EnumDevices returned %#lx\n", hr );
+ }
+
+ ref = IDirectInput_Release( data.dinput );
+ ok( ref == 0, "Release returned %lu\n", ref );
+
+ winetest_pop_context();
+}
+
+struct overlapped_state
+{
+ BYTE keys[4];
+ DWORD extra_element;
+};
+
+static DIOBJECTDATAFORMAT obj_overlapped_slider_format[] =
+{
+ {&GUID_Key, 0, DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_MAKEINSTANCE( DIK_A ), 0},
+ {&GUID_Key, 1, DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_MAKEINSTANCE( DIK_S ), 0},
+ {&GUID_Key, 2, DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_MAKEINSTANCE( DIK_D ), 0},
+ {&GUID_Key, 3, DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_MAKEINSTANCE( DIK_F ), 0},
+ {&GUID_Slider, 0, DIDFT_OPTIONAL | DIDFT_AXIS | DIDFT_ANYINSTANCE, DIDOI_ASPECTPOSITION},
+};
+
+static const DIDATAFORMAT overlapped_slider_format =
+{
+ sizeof(DIDATAFORMAT),
+ sizeof(DIOBJECTDATAFORMAT),
+ DIDF_ABSAXIS,
+ sizeof(struct overlapped_state),
+ ARRAY_SIZE(obj_overlapped_slider_format),
+ obj_overlapped_slider_format,
+};
+
+static DIOBJECTDATAFORMAT obj_overlapped_pov_format[] =
+{
+ {&GUID_Key, 0, DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_MAKEINSTANCE( DIK_A ), 0},
+ {&GUID_Key, 1, DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_MAKEINSTANCE( DIK_S ), 0},
+ {&GUID_Key, 2, DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_MAKEINSTANCE( DIK_D ), 0},
+ {&GUID_Key, 3, DIDFT_OPTIONAL | DIDFT_BUTTON | DIDFT_MAKEINSTANCE( DIK_F ), 0},
+ {&GUID_POV, 0, DIDFT_OPTIONAL | DIDFT_POV | DIDFT_ANYINSTANCE, 0},
+};
+
+static const DIDATAFORMAT overlapped_pov_format =
+{
+ sizeof(DIDATAFORMAT),
+ sizeof(DIOBJECTDATAFORMAT),
+ DIDF_ABSAXIS,
+ sizeof(struct overlapped_state),
+ ARRAY_SIZE(obj_overlapped_pov_format),
+ obj_overlapped_pov_format,
+};
+
+void test_overlapped_format( DWORD version )
+{
+ static const DIPROPDWORD buffer_size =
+ {
+ .diph =
+ {
+ .dwSize = sizeof(DIPROPDWORD),
+ .dwHeaderSize = sizeof(DIPROPHEADER),
+ .dwHow = DIPH_DEVICE,
+ },
+ .dwData = 10,
+ };
+ SIZE_T data_size = version < 0x800 ? sizeof(DIDEVICEOBJECTDATA_DX3) : sizeof(DIDEVICEOBJECTDATA);
+ struct overlapped_state state;
+ IDirectInputDeviceA *keyboard;
+ IDirectInputA *dinput;
+ DWORD res, count;
+ HANDLE event;
+ HRESULT hr;
+ HWND hwnd;
+
+ if (FAILED(hr = direct_input_create( version, &dinput ))) return;
+
+ winetest_push_context( "%#lx", version );
+
+ event = CreateEventW( NULL, FALSE, FALSE, NULL );
+ ok( !!event, "CreateEventW failed, error %lu\n", GetLastError() );
+ hwnd = CreateWindowW( L"static", L"Title", WS_POPUP | WS_VISIBLE, 10, 10, 200, 200, NULL, NULL, NULL, NULL );
+ ok( !!hwnd, "CreateWindowW failed, error %lu\n", GetLastError() );
+
+ hr = IDirectInput_CreateDevice( dinput, &GUID_SysKeyboard, &keyboard, NULL );
+ ok( hr == DI_OK, "CreateDevice returned %#lx\n", hr );
+ hr = IDirectInputDevice8_SetCooperativeLevel( keyboard, hwnd, DISCL_FOREGROUND|DISCL_EXCLUSIVE );
+ ok( hr == DI_OK, "SetCooperativeLevel returned %#lx\n", hr );
+ hr = IDirectInputDevice8_SetEventNotification( keyboard, event );
+ ok( hr == DI_OK, "SetEventNotification returned %#lx\n", hr );
+
+ /* test overlapped slider - default value 0 */
+ hr = IDirectInputDevice_SetDataFormat( keyboard, &overlapped_slider_format );
+ ok( hr == DI_OK, "SetDataFormat returned %#lx\n", hr );
+ hr = IDirectInputDevice_SetProperty( keyboard, DIPROP_BUFFERSIZE, &buffer_size.diph );
+ ok( hr == DI_OK, "SetProperty returned %#lx\n", hr );
+
+
+ hr = IDirectInputDevice_Acquire( keyboard );
+ ok( hr == DI_OK, "Acquire returned %#lx\n", hr );
+
+ keybd_event( 0, DIK_F, KEYEVENTF_SCANCODE, 0 );
+ res = WaitForSingleObject( event, 100 );
+ if (res == WAIT_TIMEOUT) /* Acquire is asynchronous */
+ {
+ keybd_event( 0, DIK_F, KEYEVENTF_SCANCODE, 0 );
+ res = WaitForSingleObject( event, 100 );
+ }
+ ok( res == WAIT_OBJECT_0, "WaitForSingleObject returned %#lx\n", res );
+
+ keybd_event( 0, DIK_F, KEYEVENTF_SCANCODE | KEYEVENTF_KEYUP, 0 );
+ res = WaitForSingleObject( event, 100 );
+ ok( res == WAIT_OBJECT_0, "WaitForSingleObject returned %#lx\n", res );
+
+ count = 10;
+ hr = IDirectInputDevice_GetDeviceData( keyboard, data_size, NULL, &count, 0 );
+ ok( hr == DI_OK, "GetDeviceData returned %#lx\n", hr );
+ ok( count > 0, "got count %lu\n", count );
+
+
+ /* press D */
+ keybd_event( 0, DIK_D, KEYEVENTF_SCANCODE, 0 );
+ res = WaitForSingleObject( event, 100 );
+ ok( res == WAIT_OBJECT_0, "WaitForSingleObject returned %#lx\n", res );
+
+ count = 10;
+ hr = IDirectInputDevice_GetDeviceData( keyboard, data_size, NULL, &count, 0 );
+ ok( hr == DI_OK, "GetDeviceData returned %#lx\n", hr );
+ ok( count == 1, "got count %lu\n", count );
+
+ memset( &state, 0xFF, sizeof(state) );
+ hr = IDirectInputDevice_GetDeviceState( keyboard, sizeof(state), &state );
+ ok( hr == DI_OK, "GetDeviceState returned %#lx\n", hr );
+
+ ok( state.keys[0] == 0x00, "key A should be still up\n" );
+ ok( state.keys[1] == 0x00, "key S should be still up\n" );
+ ok( state.keys[2] == 0x80, "keydown for D did not register\n" );
+ ok( state.keys[3] == 0x00, "key F should be still up\n" );
+ ok( state.extra_element == 0, "State struct was not memset to zero\n" );
+
+ /* release D */
+ keybd_event( 0, DIK_D, KEYEVENTF_SCANCODE | KEYEVENTF_KEYUP, 0 );
+ res = WaitForSingleObject( event, 100 );
+ ok( res == WAIT_OBJECT_0, "WaitForSingleObject returned %#lx\n", res );
+
+ count = 10;
+ hr = IDirectInputDevice_GetDeviceData( keyboard, data_size, NULL, &count, 0 );
+ ok( hr == DI_OK, "GetDeviceData returned %#lx\n", hr );
+ ok( count == 1, "got count %lu\n", count );
+
+
+ hr = IDirectInputDevice_Unacquire( keyboard );
+ ok( hr == DI_OK, "Unacquire returned %#lx\n", hr );
+
+ /* test overlapped pov - default value - 0xFFFFFFFF */
+ hr = IDirectInputDevice_SetDataFormat( keyboard, &overlapped_pov_format );
+ ok( hr == DI_OK, "SetDataFormat returned %#lx\n", hr );
+
+
+ hr = IDirectInputDevice_Acquire( keyboard );
+ ok( hr == DI_OK, "Acquire returned %#lx\n", hr );
+
+ keybd_event( 0, DIK_F, KEYEVENTF_SCANCODE, 0 );
+ res = WaitForSingleObject( event, 100 );
+ if (res == WAIT_TIMEOUT) /* Acquire is asynchronous */
+ {
+ keybd_event( 0, DIK_F, KEYEVENTF_SCANCODE, 0 );
+ res = WaitForSingleObject( event, 100 );
+ }
+ ok( res == WAIT_OBJECT_0, "WaitForSingleObject returned %#lx\n", res );
+
+ keybd_event( 0, DIK_F, KEYEVENTF_SCANCODE | KEYEVENTF_KEYUP, 0 );
+ res = WaitForSingleObject( event, 100 );
+ ok( res == WAIT_OBJECT_0, "WaitForSingleObject returned %#lx\n", res );
+
+ count = 10;
+ hr = IDirectInputDevice_GetDeviceData( keyboard, data_size, NULL, &count, 0 );
+ ok( hr == DI_OK, "GetDeviceData returned %#lx\n", hr );
+ ok( count > 0, "got count %lu\n", count );
+
+
+ /* press D */
+ keybd_event( 0, DIK_D, KEYEVENTF_SCANCODE, 0 );
+ res = WaitForSingleObject( event, 100 );
+ ok( res == WAIT_OBJECT_0, "WaitForSingleObject returned %#lx\n", res );
+
+ count = 10;
+ hr = IDirectInputDevice_GetDeviceData( keyboard, data_size, NULL, &count, 0 );
+ ok( hr == DI_OK, "GetDeviceData returned %#lx\n", hr );
+ ok( count == 1, "got count %lu\n", count );
+
+ memset( &state, 0xFF, sizeof(state) );
+ hr = IDirectInputDevice_GetDeviceState( keyboard, sizeof(state), &state );
+ ok( hr == DI_OK, "GetDeviceState returned %#lx\n", hr );
+
+ ok( state.keys[0] == 0xFF, "key state should have been overwritten by the overlapped POV\n" );
+ ok( state.keys[1] == 0xFF, "key state should have been overwritten by the overlapped POV\n" );
+ ok( state.keys[2] == 0xFF, "key state should have been overwritten by the overlapped POV\n" );
+ ok( state.keys[3] == 0xFF, "key state should have been overwritten by the overlapped POV\n" );
+ ok( state.extra_element == 0, "State struct was not memset to zero\n" );
+
+ /* release D */
+ keybd_event( 0, DIK_D, KEYEVENTF_SCANCODE | KEYEVENTF_KEYUP, 0 );
+ res = WaitForSingleObject( event, 100 );
+ ok( res == WAIT_OBJECT_0, "WaitForSingleObject returned %#lx\n", res );
+
+ count = 10;
+ hr = IDirectInputDevice_GetDeviceData( keyboard, data_size, NULL, &count, 0 );
+ ok( hr == DI_OK, "GetDeviceData returned %#lx\n", hr );
+ ok( count == 1, "got count %lu\n", count );
+
+
+ IUnknown_Release( keyboard );
+
+ DestroyWindow( hwnd );
+ CloseHandle( event );
+
+ winetest_pop_context();
+}
+
static void test_device_input( IDirectInputDevice8A *device, DWORD type, DWORD code, UINT_PTR expected )
{
HRESULT hr;
@@ -110,6 +442,11 @@ static void test_device_input( IDirectInputDevice8A *device, DWORD type, DWORD c
{
keybd_event( 0, code, KEYEVENTF_SCANCODE, 0 );
res = WaitForSingleObject( event, 100 );
+ if (res == WAIT_TIMEOUT) /* Acquire is asynchronous */
+ {
+ keybd_event( 0, code, KEYEVENTF_SCANCODE, 0 );
+ res = WaitForSingleObject( event, 100 );
+ }
ok( res == WAIT_OBJECT_0, "WaitForSingleObject returned %#lx\n", res );
keybd_event( 0, code, KEYEVENTF_SCANCODE | KEYEVENTF_KEYUP, 0 );
@@ -120,6 +457,11 @@ static void test_device_input( IDirectInputDevice8A *device, DWORD type, DWORD c
{
mouse_event( MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0 );
res = WaitForSingleObject( event, 100 );
+ if (res == WAIT_TIMEOUT) /* Acquire is asynchronous */
+ {
+ mouse_event( MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0 );
+ res = WaitForSingleObject( event, 100 );
+ }
ok( res == WAIT_OBJECT_0, "WaitForSingleObject returned %#lx\n", res );
mouse_event( MOUSEEVENTF_LEFTUP, 0, 0, 0, 0 );
@@ -255,7 +597,7 @@ static BOOL CALLBACK enumeration_callback(const DIDEVICEINSTANCEA *lpddi, IDirec
}
/* Creating second device object to check if it has the same username */
- hr = IDirectInput_CreateDevice(data->pDI, &lpddi->guidInstance, &lpdid2, NULL);
+ hr = IDirectInput_CreateDevice(data->dinput8, &lpddi->guidInstance, &lpdid2, NULL);
ok(SUCCEEDED(hr), "IDirectInput_CreateDevice() failed: %#lx\n", hr);
/* Building and setting an action map */
@@ -382,7 +724,7 @@ static void test_action_mapping(void)
IDirectInput8A *pDI = NULL;
DIACTIONFORMATA af;
DIPROPSTRING dps;
- struct enum_data data = {pDI, &af, NULL, NULL, NULL, 0};
+ struct enum_data data = {.version = 0x800, .lpdiaf = &af};
HWND hwnd;
hr = CoCreateInstance(&CLSID_DirectInput8, 0, CLSCTX_INPROC_SERVER, &IID_IDirectInput8A, (LPVOID*)&pDI);
@@ -416,7 +758,7 @@ static void test_action_mapping(void)
af.dwBufferSize = 32;
/* This enumeration builds and sets the action map for all devices */
- data.pDI = pDI;
+ data.dinput8 = pDI;
hr = IDirectInput8_EnumDevicesBySemantics(pDI, 0, &af, enumeration_callback, &data, DIEDBSFL_ATTACHEDONLY);
ok (SUCCEEDED(hr), "EnumDevicesBySemantics failed: hr=%#lx\n", hr);
@@ -1816,6 +2158,14 @@ START_TEST(device8)
{
dinput_test_init();
+ test_QueryInterface( 0x300 );
+ test_QueryInterface( 0x500 );
+ test_QueryInterface( 0x700 );
+ test_QueryInterface( 0x800 );
+
+ test_overlapped_format( 0x700 );
+ test_overlapped_format( 0x800 );
+
test_mouse_info();
test_keyboard_info();
test_action_mapping();
--
GitLab
https://gitlab.winehq.org/wine/wine/-/merge_requests/208
June 9, 2022
[PATCH v2 2/3] dinput/tests: Use dinput_test_(init|exit) for all tests.
by Rémi Bernon
From: Rémi Bernon <rbernon(a)codeweavers.com>
Signed-off-by: Rémi Bernon <rbernon(a)codeweavers.com>
---
dlls/dinput/tests/device.c | 20 +++--
dlls/dinput/tests/device8.c | 38 ++-------
dlls/dinput/tests/dinput.c | 133 ++++++++++++++---------------
dlls/dinput/tests/dinput_test.h | 3 +-
dlls/dinput/tests/force_feedback.c | 4 +-
dlls/dinput/tests/hid.c | 52 ++++++-----
dlls/dinput/tests/hotplug.c | 4 +-
dlls/dinput/tests/joystick.c | 32 ++++---
dlls/dinput/tests/joystick8.c | 4 +-
dlls/dinput/tests/keyboard.c | 27 +++---
dlls/dinput/tests/mouse.c | 23 ++---
11 files changed, 159 insertions(+), 181 deletions(-)
diff --git a/dlls/dinput/tests/device.c b/dlls/dinput/tests/device.c
index e907c5e8598..6e1e94ba9c2 100644
--- a/dlls/dinput/tests/device.c
+++ b/dlls/dinput/tests/device.c
@@ -18,14 +18,19 @@
#define DIRECTINPUT_VERSION 0x0700
-#define COBJMACROS
-#include <windows.h>
+#include <stdarg.h>
+#include <stddef.h>
+#include <limits.h>
-#include "wine/test.h"
+#include "ntstatus.h"
+#define WIN32_NO_STATUS
#include "windef.h"
+#include "winbase.h"
+
+#define COBJMACROS
#include "dinput.h"
-#include <limits.h>
+#include "dinput_test.h"
static const DIOBJECTDATAFORMAT obj_data_format[] = {
{ &GUID_YAxis, 16, DIDFT_OPTIONAL|DIDFT_AXIS |DIDFT_MAKEINSTANCE(1), 0},
@@ -465,7 +470,6 @@ static void device_tests(void)
{
HRESULT hr;
IDirectInputA *pDI = NULL, *obj = NULL;
- HINSTANCE hInstance = GetModuleHandleW(NULL);
HWND hwnd;
struct enum_data data;
@@ -478,7 +482,7 @@ static void device_tests(void)
ok(SUCCEEDED(hr), "DirectInputCreateA() failed: %#lx\n", hr);
if (FAILED(hr)) return;
- hr = IDirectInput_Initialize(pDI, hInstance, DIRECTINPUT_VERSION);
+ hr = IDirectInput_Initialize(pDI, instance, DIRECTINPUT_VERSION);
ok(SUCCEEDED(hr), "Initialize() failed: %#lx\n", hr);
if (FAILED(hr)) return;
@@ -521,9 +525,9 @@ static void device_tests(void)
START_TEST(device)
{
- CoInitialize(NULL);
+ dinput_test_init();
device_tests();
- CoUninitialize();
+ dinput_test_exit();
}
diff --git a/dlls/dinput/tests/device8.c b/dlls/dinput/tests/device8.c
index 2586736cb1d..70c3e516f17 100644
--- a/dlls/dinput/tests/device8.c
+++ b/dlls/dinput/tests/device8.c
@@ -31,10 +31,7 @@
#include "dinput.h"
#include "hidusage.h"
-#include "wine/test.h"
-
-static HINSTANCE instance;
-static BOOL localized; /* object names get translated */
+#include "dinput_test.h"
struct enum_data {
IDirectInput8A *pDI;
@@ -382,7 +379,6 @@ static void test_appdata_property_vs_map(struct enum_data *data)
static void test_action_mapping(void)
{
HRESULT hr;
- HINSTANCE hinst = GetModuleHandleA(NULL);
IDirectInput8A *pDI = NULL;
DIACTIONFORMATA af;
DIPROPSTRING dps;
@@ -400,7 +396,7 @@ static void test_action_mapping(void)
ok(SUCCEEDED(hr), "DirectInput8 Create failed: hr=%#lx\n", hr);
if (FAILED(hr)) return;
- hr = IDirectInput8_Initialize(pDI,hinst, DIRECTINPUT_VERSION);
+ hr = IDirectInput8_Initialize(pDI, instance, DIRECTINPUT_VERSION);
if (hr == DIERR_OLDDIRECTINPUTVERSION || hr == DIERR_BETADIRECTINPUTVERSION)
{
win_skip("ActionMapping requires dinput8\n");
@@ -520,7 +516,6 @@ static void test_action_mapping(void)
static void test_save_settings(void)
{
HRESULT hr;
- HINSTANCE hinst = GetModuleHandleA(NULL);
IDirectInput8A *pDI = NULL;
DIACTIONFORMATA af;
IDirectInputDevice8A *pKey;
@@ -552,7 +547,7 @@ static void test_save_settings(void)
ok (SUCCEEDED(hr), "DirectInput8 Create failed: hr=%#lx\n", hr);
if (FAILED(hr)) return;
- hr = IDirectInput8_Initialize(pDI,hinst, DIRECTINPUT_VERSION);
+ hr = IDirectInput8_Initialize(pDI, instance, DIRECTINPUT_VERSION);
if (hr == DIERR_OLDDIRECTINPUTVERSION || hr == DIERR_BETADIRECTINPUTVERSION)
{
win_skip("ActionMapping requires dinput8\n");
@@ -955,7 +950,6 @@ static void test_keyboard_events(void)
static void test_appdata_property(void)
{
HRESULT hr;
- HINSTANCE hinst = GetModuleHandleA(NULL);
IDirectInputDevice8A *di_keyboard;
IDirectInput8A *pDI = NULL;
HWND hwnd;
@@ -973,7 +967,7 @@ static void test_appdata_property(void)
ok(SUCCEEDED(hr), "DirectInput8 Create failed: hr=%#lx\n", hr);
if (FAILED(hr)) return;
- hr = IDirectInput8_Initialize(pDI,hinst, DIRECTINPUT_VERSION);
+ hr = IDirectInput8_Initialize(pDI, instance, DIRECTINPUT_VERSION);
if (hr == DIERR_OLDDIRECTINPUTVERSION || hr == DIERR_BETADIRECTINPUTVERSION)
{
win_skip("DIPROP_APPDATA requires dinput8\n");
@@ -1054,24 +1048,6 @@ static void test_appdata_property(void)
IDirectInput_Release(pDI);
}
-#define check_member_( file, line, val, exp, fmt, member ) \
- ok_( file, line )((val).member == (exp).member, "got " #member " " fmt ", expected " fmt "\n", \
- (val).member, (exp).member)
-#define check_member( val, exp, fmt, member ) \
- check_member_( __FILE__, __LINE__, val, exp, fmt, member )
-
-#define check_member_guid_( file, line, val, exp, member ) \
- ok_( file, line )(IsEqualGUID( &(val).member, &(exp).member ), "got " #member " %s, expected %s\n", \
- debugstr_guid( &(val).member ), debugstr_guid( &(exp).member ))
-#define check_member_guid( val, exp, member ) \
- check_member_guid_( __FILE__, __LINE__, val, exp, member )
-
-#define check_member_wstr_( file, line, val, exp, member ) \
- ok_( file, line )(!wcscmp( (val).member, (exp).member ), "got " #member " %s, expected %s\n", \
- debugstr_w((val).member), debugstr_w((exp).member))
-#define check_member_wstr( val, exp, member ) \
- check_member_wstr_( __FILE__, __LINE__, val, exp, member )
-
struct check_objects_todos
{
BOOL offset;
@@ -1838,9 +1814,7 @@ static void test_keyboard_info(void)
START_TEST(device8)
{
- instance = GetModuleHandleW( NULL );
-
- CoInitialize(NULL);
+ dinput_test_init();
test_mouse_info();
test_keyboard_info();
@@ -1850,5 +1824,5 @@ START_TEST(device8)
test_keyboard_events();
test_appdata_property();
- CoUninitialize();
+ dinput_test_exit();
}
diff --git a/dlls/dinput/tests/dinput.c b/dlls/dinput/tests/dinput.c
index 29d17ce378e..7df8f3ace85 100644
--- a/dlls/dinput/tests/dinput.c
+++ b/dlls/dinput/tests/dinput.c
@@ -18,19 +18,21 @@
#define DIRECTINPUT_VERSION 0x0700
-#define COBJMACROS
-#include <windows.h>
-#include "objbase.h"
+#include <stdarg.h>
+#include <stddef.h>
-#include <initguid.h>
-#include <dinput.h>
-#include <dinputd.h>
+#include "ntstatus.h"
+#define WIN32_NO_STATUS
+#include "windef.h"
+#include "winbase.h"
-#include "wine/test.h"
+#define COBJMACROS
+#include "dinput.h"
+#include "dinputd.h"
-HINSTANCE hInstance;
+#include "dinput_test.h"
-static HRESULT (WINAPI *pDirectInputCreateEx)(HINSTANCE, DWORD, REFIID, LPVOID *, LPUNKNOWN);
+#include "initguid.h"
static const DWORD dinput_versions[] =
{
@@ -64,8 +66,8 @@ static REFIID dinput8_interfaces[] =
static HRESULT direct_input_create( DWORD version, IDirectInputA **out )
{
HRESULT hr;
- if (version < 0x800) hr = DirectInputCreateA( hInstance, version, out, NULL );
- else hr = DirectInput8Create( hInstance, version, &IID_IDirectInput8A, (void **)out, NULL );
+ if (version < 0x800) hr = DirectInputCreateA( instance, version, out, NULL );
+ else hr = DirectInput8Create( instance, version, &IID_IDirectInput8A, (void **)out, NULL );
if (FAILED(hr)) win_skip( "Failed to instantiate a IDirectInput instance, hr %#lx\n", hr );
return hr;
}
@@ -236,19 +238,19 @@ static void test_DirectInputCreate( DWORD version )
{NULL, version - 1, NULL, &unknown, NULL, DIERR_INVALIDPARAM},
{NULL, version + 1, NULL, NULL, (void *)0xdeadbeef, E_POINTER},
{NULL, version + 1, NULL, &unknown, NULL, DIERR_INVALIDPARAM},
- {hInstance, 0, NULL, NULL, (void *)0xdeadbeef, E_POINTER},
- {hInstance, 0, NULL, &unknown, NULL, DIERR_NOTINITIALIZED},
- {hInstance, version, NULL, NULL, (void *)0xdeadbeef, E_POINTER},
- {hInstance, version - 1, NULL, NULL, (void *)0xdeadbeef, E_POINTER},
- {hInstance, version - 1, NULL, &unknown, NULL, version <= 0x700 ? DIERR_BETADIRECTINPUTVERSION : DIERR_OLDDIRECTINPUTVERSION},
- {hInstance, version + 1, NULL, NULL, (void *)0xdeadbeef, E_POINTER},
- {hInstance, version + 1, NULL, &unknown, NULL, version < 0x700 ? DIERR_BETADIRECTINPUTVERSION : DIERR_OLDDIRECTINPUTVERSION},
+ {instance, 0, NULL, NULL, (void *)0xdeadbeef, E_POINTER},
+ {instance, 0, NULL, &unknown, NULL, DIERR_NOTINITIALIZED},
+ {instance, version, NULL, NULL, (void *)0xdeadbeef, E_POINTER},
+ {instance, version - 1, NULL, NULL, (void *)0xdeadbeef, E_POINTER},
+ {instance, version - 1, NULL, &unknown, NULL, version <= 0x700 ? DIERR_BETADIRECTINPUTVERSION : DIERR_OLDDIRECTINPUTVERSION},
+ {instance, version + 1, NULL, NULL, (void *)0xdeadbeef, E_POINTER},
+ {instance, version + 1, NULL, &unknown, NULL, version < 0x700 ? DIERR_BETADIRECTINPUTVERSION : DIERR_OLDDIRECTINPUTVERSION},
};
HRESULT hr;
int i;
unknown = (void *)0xdeadbeef;
- hr = DirectInputCreateW( hInstance, version, (IDirectInputW **)&unknown, &outer );
+ hr = DirectInputCreateW( instance, version, (IDirectInputW **)&unknown, &outer );
ok( hr == DI_OK, "DirectInputCreateW returned %#lx\n", hr );
ok( unknown == NULL, "got IUnknown %p\n", unknown );
@@ -294,21 +296,21 @@ static void test_DirectInputCreateEx( DWORD version )
{NULL, version + 1, &IID_IUnknown, &unknown, (void *)0xdeadbeef, DIERR_NOINTERFACE},
{NULL, version + 1, &IID_IDirectInputA, NULL, (void *)0xdeadbeef, E_POINTER},
{NULL, version + 1, &IID_IDirectInputA, &unknown, NULL, DIERR_INVALIDPARAM},
- {hInstance, 0, &IID_IUnknown, NULL, (void *)0xdeadbeef, DIERR_NOINTERFACE},
- {hInstance, 0, &IID_IUnknown, &unknown, (void *)0xdeadbeef, DIERR_NOINTERFACE},
- {hInstance, 0, &IID_IDirectInputA, NULL, (void *)0xdeadbeef, E_POINTER},
- {hInstance, 0, &IID_IDirectInputA, &unknown, NULL, DIERR_NOTINITIALIZED},
- {hInstance, version, &IID_IUnknown, NULL, (void *)0xdeadbeef, DIERR_NOINTERFACE},
- {hInstance, version, &IID_IUnknown, &unknown, (void *)0xdeadbeef, DIERR_NOINTERFACE},
- {hInstance, version, &IID_IDirectInputA, NULL, (void *)0xdeadbeef, E_POINTER},
- {hInstance, version - 1, &IID_IUnknown, NULL, (void *)0xdeadbeef, DIERR_NOINTERFACE},
- {hInstance, version - 1, &IID_IUnknown, &unknown, (void *)0xdeadbeef, DIERR_NOINTERFACE},
- {hInstance, version - 1, &IID_IDirectInputA, NULL, (void *)0xdeadbeef, E_POINTER},
- {hInstance, version - 1, &IID_IDirectInputA, &unknown, NULL, version <= 0x700 ? DIERR_BETADIRECTINPUTVERSION : DIERR_OLDDIRECTINPUTVERSION},
- {hInstance, version + 1, &IID_IUnknown, NULL, (void *)0xdeadbeef, DIERR_NOINTERFACE},
- {hInstance, version + 1, &IID_IUnknown, &unknown, (void *)0xdeadbeef, DIERR_NOINTERFACE},
- {hInstance, version + 1, &IID_IDirectInputA, NULL, (void *)0xdeadbeef, E_POINTER},
- {hInstance, version + 1, &IID_IDirectInputA, &unknown, NULL, version < 0x700 ? DIERR_BETADIRECTINPUTVERSION : DIERR_OLDDIRECTINPUTVERSION},
+ {instance, 0, &IID_IUnknown, NULL, (void *)0xdeadbeef, DIERR_NOINTERFACE},
+ {instance, 0, &IID_IUnknown, &unknown, (void *)0xdeadbeef, DIERR_NOINTERFACE},
+ {instance, 0, &IID_IDirectInputA, NULL, (void *)0xdeadbeef, E_POINTER},
+ {instance, 0, &IID_IDirectInputA, &unknown, NULL, DIERR_NOTINITIALIZED},
+ {instance, version, &IID_IUnknown, NULL, (void *)0xdeadbeef, DIERR_NOINTERFACE},
+ {instance, version, &IID_IUnknown, &unknown, (void *)0xdeadbeef, DIERR_NOINTERFACE},
+ {instance, version, &IID_IDirectInputA, NULL, (void *)0xdeadbeef, E_POINTER},
+ {instance, version - 1, &IID_IUnknown, NULL, (void *)0xdeadbeef, DIERR_NOINTERFACE},
+ {instance, version - 1, &IID_IUnknown, &unknown, (void *)0xdeadbeef, DIERR_NOINTERFACE},
+ {instance, version - 1, &IID_IDirectInputA, NULL, (void *)0xdeadbeef, E_POINTER},
+ {instance, version - 1, &IID_IDirectInputA, &unknown, NULL, version <= 0x700 ? DIERR_BETADIRECTINPUTVERSION : DIERR_OLDDIRECTINPUTVERSION},
+ {instance, version + 1, &IID_IUnknown, NULL, (void *)0xdeadbeef, DIERR_NOINTERFACE},
+ {instance, version + 1, &IID_IUnknown, &unknown, (void *)0xdeadbeef, DIERR_NOINTERFACE},
+ {instance, version + 1, &IID_IDirectInputA, NULL, (void *)0xdeadbeef, E_POINTER},
+ {instance, version + 1, &IID_IDirectInputA, &unknown, NULL, version < 0x700 ? DIERR_BETADIRECTINPUTVERSION : DIERR_OLDDIRECTINPUTVERSION},
};
HRESULT hr;
int i;
@@ -320,7 +322,7 @@ static void test_DirectInputCreateEx( DWORD version )
}
unknown = (void *)0xdeadbeef;
- hr = pDirectInputCreateEx( hInstance, version, &IID_IDirectInputW, (void **)&unknown, &outer );
+ hr = pDirectInputCreateEx( instance, version, &IID_IDirectInputW, (void **)&unknown, &outer );
ok( hr == DI_OK, "DirectInputCreateW returned %#lx\n", hr );
ok( unknown == NULL, "got IUnknown %p\n", unknown );
@@ -341,7 +343,7 @@ static void test_DirectInputCreateEx( DWORD version )
{
winetest_push_context( "%u", i );
unknown = (void *)0xdeadbeef;
- hr = pDirectInputCreateEx( hInstance, version, dinput8_interfaces[i], (void **)&unknown, NULL );
+ hr = pDirectInputCreateEx( instance, version, dinput8_interfaces[i], (void **)&unknown, NULL );
ok( hr == DIERR_NOINTERFACE, "DirectInputCreateEx returned %#lx\n", hr );
ok( unknown == (void *)0xdeadbeef, "got IUnknown %p\n", unknown );
winetest_pop_context();
@@ -351,7 +353,7 @@ static void test_DirectInputCreateEx( DWORD version )
{
winetest_push_context( "%u", i );
unknown = NULL;
- hr = pDirectInputCreateEx( hInstance, version, dinput7_interfaces[i], (void **)&unknown, NULL );
+ hr = pDirectInputCreateEx( instance, version, dinput7_interfaces[i], (void **)&unknown, NULL );
if (version < 0x800) ok( hr == DI_OK, "DirectInputCreateEx returned %#lx\n", hr );
else ok( hr == DIERR_OLDDIRECTINPUTVERSION, "DirectInputCreateEx returned %#lx\n", hr );
if (version < 0x800) ok( unknown != NULL, "got IUnknown NULL\n" );
@@ -390,27 +392,27 @@ static void test_DirectInput8Create( DWORD version )
{NULL, version + 1, &IID_IDirectInputA, &unknown, NULL, DIERR_NOINTERFACE},
{NULL, version + 1, &IID_IDirectInput8A, NULL, (void *)0xdeadbeef, E_POINTER},
{NULL, version + 1, &IID_IDirectInput8A, &unknown, NULL, DIERR_INVALIDPARAM},
- {hInstance, 0, &IID_IDirectInputA, NULL, (void *)0xdeadbeef, E_POINTER},
- {hInstance, 0, &IID_IDirectInputA, &unknown, NULL, DIERR_NOINTERFACE},
- {hInstance, 0, &IID_IDirectInput8A, NULL, (void *)0xdeadbeef, E_POINTER},
- {hInstance, 0, &IID_IDirectInput8A, &unknown, NULL, DIERR_NOTINITIALIZED},
- {hInstance, version, &IID_IDirectInputA, NULL, (void *)0xdeadbeef, E_POINTER},
- {hInstance, version, &IID_IDirectInputA, &unknown, NULL, DIERR_NOINTERFACE},
- {hInstance, version, &IID_IDirectInput8A, NULL, (void *)0xdeadbeef, E_POINTER},
- {hInstance, version - 1, &IID_IDirectInputA, NULL, (void *)0xdeadbeef, E_POINTER},
- {hInstance, version - 1, &IID_IDirectInputA, &unknown, NULL, DIERR_NOINTERFACE},
- {hInstance, version - 1, &IID_IDirectInput8A, NULL, (void *)0xdeadbeef, E_POINTER},
- {hInstance, version - 1, &IID_IDirectInput8A, &unknown, NULL, DIERR_BETADIRECTINPUTVERSION},
- {hInstance, version + 1, &IID_IDirectInputA, NULL, (void *)0xdeadbeef, E_POINTER},
- {hInstance, version + 1, &IID_IDirectInputA, &unknown, NULL, DIERR_NOINTERFACE},
- {hInstance, version + 1, &IID_IDirectInput8A, NULL, (void *)0xdeadbeef, E_POINTER},
- {hInstance, version + 1, &IID_IDirectInput8A, &unknown, NULL, version <= 0x700 ? DIERR_BETADIRECTINPUTVERSION : DIERR_OLDDIRECTINPUTVERSION},
+ {instance, 0, &IID_IDirectInputA, NULL, (void *)0xdeadbeef, E_POINTER},
+ {instance, 0, &IID_IDirectInputA, &unknown, NULL, DIERR_NOINTERFACE},
+ {instance, 0, &IID_IDirectInput8A, NULL, (void *)0xdeadbeef, E_POINTER},
+ {instance, 0, &IID_IDirectInput8A, &unknown, NULL, DIERR_NOTINITIALIZED},
+ {instance, version, &IID_IDirectInputA, NULL, (void *)0xdeadbeef, E_POINTER},
+ {instance, version, &IID_IDirectInputA, &unknown, NULL, DIERR_NOINTERFACE},
+ {instance, version, &IID_IDirectInput8A, NULL, (void *)0xdeadbeef, E_POINTER},
+ {instance, version - 1, &IID_IDirectInputA, NULL, (void *)0xdeadbeef, E_POINTER},
+ {instance, version - 1, &IID_IDirectInputA, &unknown, NULL, DIERR_NOINTERFACE},
+ {instance, version - 1, &IID_IDirectInput8A, NULL, (void *)0xdeadbeef, E_POINTER},
+ {instance, version - 1, &IID_IDirectInput8A, &unknown, NULL, DIERR_BETADIRECTINPUTVERSION},
+ {instance, version + 1, &IID_IDirectInputA, NULL, (void *)0xdeadbeef, E_POINTER},
+ {instance, version + 1, &IID_IDirectInputA, &unknown, NULL, DIERR_NOINTERFACE},
+ {instance, version + 1, &IID_IDirectInput8A, NULL, (void *)0xdeadbeef, E_POINTER},
+ {instance, version + 1, &IID_IDirectInput8A, &unknown, NULL, version <= 0x700 ? DIERR_BETADIRECTINPUTVERSION : DIERR_OLDDIRECTINPUTVERSION},
};
HRESULT hr;
int i;
unknown = (void *)0xdeadbeef;
- hr = DirectInput8Create( hInstance, version, &IID_IDirectInput8W, (void **)&unknown, &outer );
+ hr = DirectInput8Create( instance, version, &IID_IDirectInput8W, (void **)&unknown, &outer );
ok( hr == DI_OK, "DirectInputCreateW returned %#lx\n", hr );
ok( unknown == NULL, "got IUnknown %p\n", unknown );
@@ -430,7 +432,7 @@ static void test_DirectInput8Create( DWORD version )
{
winetest_push_context( "%u", i );
unknown = (void *)0xdeadbeef;
- hr = DirectInput8Create( hInstance, version, dinput7_interfaces[i], (void **)&unknown, NULL );
+ hr = DirectInput8Create( instance, version, dinput7_interfaces[i], (void **)&unknown, NULL );
ok( hr == DIERR_NOINTERFACE, "DirectInput8Create returned %#lx\n", hr );
ok( unknown == NULL, "got IUnknown %p\n", unknown );
winetest_pop_context();
@@ -440,7 +442,7 @@ static void test_DirectInput8Create( DWORD version )
{
winetest_push_context( "%u", i );
unknown = NULL;
- hr = DirectInput8Create( hInstance, version, dinput8_interfaces[i], (void **)&unknown, NULL );
+ hr = DirectInput8Create( instance, version, dinput8_interfaces[i], (void **)&unknown, NULL );
if (i == 2) ok( hr == DIERR_NOINTERFACE, "DirectInput8Create returned %#lx\n", hr );
else if (version == 0x800) ok( hr == DI_OK, "DirectInput8Create returned %#lx\n", hr );
else ok( hr == DIERR_BETADIRECTINPUTVERSION, "DirectInput8Create returned %#lx\n", hr );
@@ -762,18 +764,18 @@ static void test_Initialize( DWORD version )
if (version == 0x300) todo_wine ok( hr == S_OK, "Initialize returned %#lx\n", hr );
else ok( hr == DIERR_INVALIDPARAM, "Initialize returned %#lx\n", hr );
- hr = IDirectInput_Initialize( dinput, hInstance, 0 );
+ hr = IDirectInput_Initialize( dinput, instance, 0 );
ok( hr == DIERR_NOTINITIALIZED, "Initialize returned %#lx\n", hr );
- hr = IDirectInput_Initialize( dinput, hInstance, version - 1 );
+ hr = IDirectInput_Initialize( dinput, instance, version - 1 );
ok( hr == DIERR_BETADIRECTINPUTVERSION, "Initialize returned %#lx\n", hr );
- hr = IDirectInput_Initialize( dinput, hInstance, version + 1 );
+ hr = IDirectInput_Initialize( dinput, instance, version + 1 );
if (version >= 0x700) ok( hr == DIERR_OLDDIRECTINPUTVERSION, "Initialize returned %#lx\n", hr );
else ok( hr == DIERR_BETADIRECTINPUTVERSION, "Initialize returned %#lx\n", hr );
/* Parameters are still validated after successful initialization. */
- hr = IDirectInput_Initialize( dinput, hInstance, 0 );
+ hr = IDirectInput_Initialize( dinput, instance, 0 );
ok( hr == DIERR_NOTINITIALIZED, "Initialize returned %#lx\n", hr );
ref = IDirectInput_Release( dinput );
@@ -819,7 +821,7 @@ static void test_DirectInputJoyConfig8(void)
HRESULT hr;
int i;
- hr = DirectInputCreateA(hInstance, DIRECTINPUT_VERSION, &pDI, NULL);
+ hr = DirectInputCreateA(instance, DIRECTINPUT_VERSION, &pDI, NULL);
if (FAILED(hr))
{
win_skip("Failed to instantiate a IDirectInputA instance: 0x%#lx\n", hr);
@@ -933,7 +935,7 @@ static void test_EnumDevicesBySemantics(void)
int device_total = 0;
HRESULT hr;
- hr = DirectInput8Create( hInstance, 0x800, &IID_IDirectInput8A, (void **)&dinput, NULL );
+ hr = DirectInput8Create( instance, 0x800, &IID_IDirectInput8A, (void **)&dinput, NULL );
if (FAILED(hr))
{
win_skip( "Failed to instantiate a IDirectInputA instance: 0x%#lx\n", hr );
@@ -1051,17 +1053,12 @@ static void test_EnumDevicesBySemantics(void)
START_TEST(dinput)
{
- HMODULE dinput_mod = GetModuleHandleA("dinput.dll");
DWORD i;
- hInstance = GetModuleHandleA(NULL);
+ dinput_test_init();
- pDirectInputCreateEx = (void *)GetProcAddress(dinput_mod, "DirectInputCreateEx");
-
- CoInitialize( NULL );
test_CoCreateInstance( 0x700 );
test_CoCreateInstance( 0x800 );
- CoUninitialize();
for (i = 0; i < ARRAY_SIZE(dinput_versions); i++)
{
@@ -1080,4 +1077,6 @@ START_TEST(dinput)
test_DirectInputJoyConfig8();
test_EnumDevicesBySemantics();
+
+ dinput_test_exit();
}
diff --git a/dlls/dinput/tests/dinput_test.h b/dlls/dinput/tests/dinput_test.h
index 677f8c96361..04738cffb44 100644
--- a/dlls/dinput/tests/dinput_test.h
+++ b/dlls/dinput/tests/dinput_test.h
@@ -50,6 +50,7 @@ extern const GUID expect_guid_product;
extern const WCHAR expect_path[];
extern const WCHAR expect_path_end[];
+extern typeof(DirectInputCreateEx) *pDirectInputCreateEx;
extern HANDLE device_added, device_removed;
extern HINSTANCE instance;
extern BOOL localized; /* object names get translated */
@@ -62,7 +63,7 @@ void bus_device_stop(void);
void cleanup_registry_keys(void);
#define dinput_test_init() dinput_test_init_( __FILE__, __LINE__ )
-BOOL dinput_test_init_( const char *file, int line );
+void dinput_test_init_( const char *file, int line );
void dinput_test_exit(void);
HRESULT dinput_test_create_device( DWORD version, DIDEVICEINSTANCEW *devinst, IDirectInputDevice8W **device );
diff --git a/dlls/dinput/tests/force_feedback.c b/dlls/dinput/tests/force_feedback.c
index 30d19cc04a0..1bcd56d685a 100644
--- a/dlls/dinput/tests/force_feedback.c
+++ b/dlls/dinput/tests/force_feedback.c
@@ -6405,10 +6405,9 @@ done:
START_TEST( force_feedback )
{
- if (!dinput_test_init()) return;
+ dinput_test_init();
if (!bus_device_start()) goto done;
- CoInitialize( NULL );
if (test_force_feedback_joystick( 0x800 ))
{
test_force_feedback_joystick( 0x500 );
@@ -6416,7 +6415,6 @@ START_TEST( force_feedback )
test_device_managed_effect();
test_windows_gaming_input();
}
- CoUninitialize();
done:
bus_device_stop();
diff --git a/dlls/dinput/tests/hid.c b/dlls/dinput/tests/hid.c
index 2d7199fa3e5..6a0d7a52fab 100644
--- a/dlls/dinput/tests/hid.c
+++ b/dlls/dinput/tests/hid.c
@@ -44,7 +44,6 @@
#include "objbase.h"
#define COBJMACROS
-#include "dinput.h"
#include "initguid.h"
#include "ddk/wdm.h"
@@ -52,13 +51,16 @@
#include "ddk/hidsdi.h"
#include "ddk/hidpi.h"
#include "ddk/hidport.h"
-#include "hidusage.h"
#include "devguid.h"
+#include "dinput.h"
+#include "dinputd.h"
+#include "hidusage.h"
#include "wine/mssign.h"
#include "dinput_test.h"
+typeof(DirectInputCreateEx) *pDirectInputCreateEx;
HINSTANCE instance;
BOOL localized; /* object names get translated */
@@ -475,6 +477,8 @@ void bus_device_stop(void)
DWORD size;
BOOL ret;
+ if (!test_data) return;
+
set = SetupDiCreateDeviceInfoList( NULL, NULL );
ok( set != INVALID_HANDLE_VALUE, "failed to create device list, error %lu\n", GetLastError() );
@@ -600,6 +604,8 @@ BOOL bus_device_start(void)
HDEVINFO set;
FILE *f;
+ if (!test_data) return FALSE;
+
old_mute_threshold = winetest_mute_threshold;
winetest_mute_threshold = 1;
@@ -3459,52 +3465,56 @@ DWORD WINAPI monitor_thread_proc( void *stop_event )
return 0;
}
-BOOL dinput_test_init_( const char *file, int line )
+void dinput_test_init_( const char *file, int line )
{
BOOL is_wow64;
monitor_stop = CreateEventW( NULL, FALSE, FALSE, NULL );
- ok( !!monitor_stop, "CreateEventW failed, error %lu\n", GetLastError() );
+ ok_(file, line)( !!monitor_stop, "CreateEventW failed, error %lu\n", GetLastError() );
device_added = CreateEventW( NULL, FALSE, FALSE, NULL );
- ok( !!device_added, "CreateEventW failed, error %lu\n", GetLastError() );
+ ok_(file, line)( !!device_added, "CreateEventW failed, error %lu\n", GetLastError() );
device_removed = CreateEventW( NULL, FALSE, FALSE, NULL );
- ok( !!device_removed, "CreateEventW failed, error %lu\n", GetLastError() );
+ ok_(file, line)( !!device_removed, "CreateEventW failed, error %lu\n", GetLastError() );
monitor_thread = CreateThread( NULL, 0, monitor_thread_proc, monitor_stop, 0, NULL );
- ok( !!monitor_thread, "CreateThread failed, error %lu\n", GetLastError() );
+ ok_(file, line)( !!monitor_thread, "CreateThread failed, error %lu\n", GetLastError() );
+
+ CoInitialize( NULL );
- subtest_(file, line)( "hid" );
instance = GetModuleHandleW( NULL );
localized = GetUserDefaultLCID() != MAKELANGID(LANG_ENGLISH, SUBLANG_DEFAULT);
pSignerSign = (void *)GetProcAddress( LoadLibraryW( L"mssign32" ), "SignerSign" );
+ pDirectInputCreateEx = (void *)GetProcAddress( LoadLibraryW(L"dinput.dll"), "DirectInputCreateEx" );
if (IsWow64Process( GetCurrentProcess(), &is_wow64 ) && is_wow64)
{
- skip( "Running in WoW64.\n" );
- return FALSE;
+ skip_(file, line)( "Skipping driver tests: running in wow64.\n" );
+ return;
}
test_data_mapping = CreateFileMappingW( INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0,
sizeof(*test_data), L"Global\\winetest_dinput_section" );
if (!test_data_mapping && GetLastError() == ERROR_ACCESS_DENIED)
{
- win_skip( "Failed to create test data mapping.\n" );
- return FALSE;
+ win_skip_(file, line)( "Skipping driver tests: failed to create mapping.\n" );
+ return;
}
- ok( !!test_data_mapping, "got error %lu\n", GetLastError() );
+ ok_(file, line)( !!test_data_mapping, "got error %lu\n", GetLastError() );
+
test_data = MapViewOfFile( test_data_mapping, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 1024 );
+ ok_(file, line)( !!test_data, "MapViewOfFile failed, error %lu\n", GetLastError() );
test_data->running_under_wine = !strcmp( winetest_platform, "wine" );
test_data->winetest_report_success = winetest_report_success;
test_data->winetest_debug = winetest_debug;
okfile = CreateFileW( L"C:\\windows\\winetest_dinput_okfile", GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, 0, NULL );
- ok( okfile != INVALID_HANDLE_VALUE, "failed to create file, error %lu\n", GetLastError() );
+ ok_(file, line)( okfile != INVALID_HANDLE_VALUE, "failed to create file, error %lu\n", GetLastError() );
- subtest( "driver" );
- subtest( "driver_bus" );
- subtest( "driver_hid" );
- subtest( "driver_hid_poll" );
- return TRUE;
+ subtest_(file, line)( "hid" );
+ subtest_(file, line)( "driver" );
+ subtest_(file, line)( "driver_bus" );
+ subtest_(file, line)( "driver_hid" );
+ subtest_(file, line)( "driver_hid_poll" );
}
void dinput_test_exit(void)
@@ -3520,6 +3530,8 @@ void dinput_test_exit(void)
CloseHandle( monitor_stop );
CloseHandle( device_removed );
CloseHandle( device_added );
+
+ CoUninitialize();
}
BOOL CALLBACK find_test_device( const DIDEVICEINSTANCEW *devinst, void *context )
@@ -3931,7 +3943,7 @@ done:
START_TEST( hid )
{
- if (!dinput_test_init()) return;
+ dinput_test_init();
test_bus_driver();
diff --git a/dlls/dinput/tests/hotplug.c b/dlls/dinput/tests/hotplug.c
index 885d0e036e0..9896e7b480e 100644
--- a/dlls/dinput/tests/hotplug.c
+++ b/dlls/dinput/tests/hotplug.c
@@ -1218,10 +1218,9 @@ next:
START_TEST( hotplug )
{
- if (!dinput_test_init()) return;
+ dinput_test_init();
if (!bus_device_start()) goto done;
- CoInitialize( NULL );
if (test_input_lost( 0x500 ))
{
test_input_lost( 0x700 );
@@ -1230,7 +1229,6 @@ START_TEST( hotplug )
test_RegisterDeviceNotification();
test_windows_gaming_input();
}
- CoUninitialize();
done:
bus_device_stop();
diff --git a/dlls/dinput/tests/joystick.c b/dlls/dinput/tests/joystick.c
index 8647b42cc94..1b85f13f9a7 100644
--- a/dlls/dinput/tests/joystick.c
+++ b/dlls/dinput/tests/joystick.c
@@ -18,18 +18,19 @@
#define DIRECTINPUT_VERSION 0x0700
-#define COBJMACROS
-#include <windows.h>
-
-#include <math.h>
-#include <stdio.h>
-#include <stdlib.h>
+#include <stdarg.h>
+#include <stddef.h>
-#include "wine/test.h"
+#include "ntstatus.h"
+#define WIN32_NO_STATUS
#include "windef.h"
-#include "wingdi.h"
+#include "winbase.h"
+
+#define COBJMACROS
#include "dinput.h"
+#include "dinput_test.h"
+
typedef struct tagUserData {
IDirectInputA *pDI;
DWORD version;
@@ -317,7 +318,6 @@ static BOOL CALLBACK EnumJoysticks(const DIDEVICEINSTANCEA *lpddi, void *pvRef)
LPDIRECTINPUTEFFECT effect = NULL;
LONG cnt1, cnt2;
HWND real_hWnd;
- HINSTANCE hInstance = GetModuleHandleW(NULL);
DIPROPDWORD dip_gain_set, dip_gain_get;
struct effect_enum effect_data;
@@ -549,7 +549,7 @@ static BOOL CALLBACK EnumJoysticks(const DIDEVICEINSTANCEA *lpddi, void *pvRef)
* - a visible window
*/
real_hWnd = CreateWindowExA(0, "EDIT", "Test text", 0, 10, 10, 300, 300, NULL, NULL,
- hInstance, NULL);
+ instance, NULL);
ok(real_hWnd!=0,"CreateWindowExA failed: %p\n", real_hWnd);
ShowWindow(real_hWnd, SW_SHOW);
hr = IDirectInputDevice_Unacquire(pJoystick);
@@ -598,7 +598,7 @@ static BOOL CALLBACK EnumJoysticks(const DIDEVICEINSTANCEA *lpddi, void *pvRef)
GUID guid = {0};
DIEFFECT effect_empty;
- hr = IDirectInputEffect_Initialize(effect, hInstance, data->version,
+ hr = IDirectInputEffect_Initialize(effect, instance, data->version,
&effect_data.guid);
ok(hr==DI_OK,"IDirectInputEffect_Initialize failed: %#lx\n", hr);
@@ -915,10 +915,9 @@ static void joystick_tests(DWORD version)
HRESULT hr;
IDirectInputA *pDI;
ULONG ref;
- HINSTANCE hInstance = GetModuleHandleW(NULL);
trace("-- Testing Direct Input Version %#lx --\n", version);
- hr = DirectInputCreateA(hInstance, version, &pDI, NULL);
+ hr = DirectInputCreateA(instance, version, &pDI, NULL);
ok(hr==DI_OK||hr==DIERR_OLDDIRECTINPUTVERSION, "DirectInputCreateA() failed: %#lx\n", hr);
if (hr==DI_OK && pDI!=0) {
UserData data;
@@ -938,9 +937,8 @@ static void test_enum_feedback(void)
HRESULT hr;
IDirectInputA *pDI;
ULONG ref;
- HINSTANCE hInstance = GetModuleHandleW(NULL);
- hr = DirectInputCreateA(hInstance, 0x0700, &pDI, NULL);
+ hr = DirectInputCreateA(instance, 0x0700, &pDI, NULL);
ok(hr==DI_OK||hr==DIERR_OLDDIRECTINPUTVERSION, "DirectInputCreateA() failed: %#lx\n", hr);
if (hr==DI_OK && pDI!=0) {
hr = IDirectInput_EnumDevices(pDI, 0, EnumAllFeedback, NULL, DIEDFL_ATTACHEDONLY | DIEDFL_FORCEFEEDBACK);
@@ -953,7 +951,7 @@ static void test_enum_feedback(void)
START_TEST(joystick)
{
- CoInitialize(NULL);
+ dinput_test_init();
joystick_tests(0x0700);
joystick_tests(0x0500);
@@ -961,5 +959,5 @@ START_TEST(joystick)
test_enum_feedback();
- CoUninitialize();
+ dinput_test_exit();
}
diff --git a/dlls/dinput/tests/joystick8.c b/dlls/dinput/tests/joystick8.c
index e4c676c4b33..c706276f146 100644
--- a/dlls/dinput/tests/joystick8.c
+++ b/dlls/dinput/tests/joystick8.c
@@ -4163,10 +4163,9 @@ done:
START_TEST( joystick8 )
{
- if (!dinput_test_init()) return;
+ dinput_test_init();
if (!bus_device_start()) goto done;
- CoInitialize( NULL );
if (test_device_types( 0x800 ))
{
/* This needs to be done before doing anything involving dinput.dll
@@ -4184,7 +4183,6 @@ START_TEST( joystick8 )
test_driving_wheel_axes();
test_windows_gaming_input();
}
- CoUninitialize();
done:
bus_device_stop();
diff --git a/dlls/dinput/tests/keyboard.c b/dlls/dinput/tests/keyboard.c
index 251a12073df..0d3cf7b10c2 100644
--- a/dlls/dinput/tests/keyboard.c
+++ b/dlls/dinput/tests/keyboard.c
@@ -18,20 +18,18 @@
#define DIRECTINPUT_VERSION 0x0700
-#define COBJMACROS
-#include <windows.h>
-
-#include <math.h>
-#include <stdio.h>
-#include <stdlib.h>
+#include <stdarg.h>
+#include <stddef.h>
-#include "wine/test.h"
+#include "ntstatus.h"
+#define WIN32_NO_STATUS
#include "windef.h"
-#include "wingdi.h"
+#include "winbase.h"
+
+#define COBJMACROS
#include "dinput.h"
-/* to make things easier with PSDK without a dinput.lib */
-static HRESULT (WINAPI *pDirectInputCreateA)(HINSTANCE,DWORD,IDirectInputA **,IUnknown *);
+#include "dinput_test.h"
static void pump_messages(void)
{
@@ -513,11 +511,10 @@ static void keyboard_tests(DWORD version)
{
HRESULT hr;
IDirectInputA *pDI = NULL;
- HINSTANCE hInstance = GetModuleHandleW(NULL);
HWND hwnd;
ULONG ref = 0;
- hr = pDirectInputCreateA(hInstance, version, &pDI, NULL);
+ hr = DirectInputCreateA(instance, version, &pDI, NULL);
if (hr == DIERR_OLDDIRECTINPUTVERSION)
{
skip("Tests require a newer dinput version\n");
@@ -554,11 +551,9 @@ static void keyboard_tests(DWORD version)
START_TEST(keyboard)
{
- pDirectInputCreateA = (void *)GetProcAddress(GetModuleHandleA("dinput.dll"), "DirectInputCreateA");
-
- CoInitialize(NULL);
+ dinput_test_init();
keyboard_tests(0x0700);
- CoUninitialize();
+ dinput_test_exit();
}
diff --git a/dlls/dinput/tests/mouse.c b/dlls/dinput/tests/mouse.c
index 8be808e5da6..2d92fe2b14c 100644
--- a/dlls/dinput/tests/mouse.c
+++ b/dlls/dinput/tests/mouse.c
@@ -19,17 +19,19 @@
#define DIRECTINPUT_VERSION 0x0700
-#define COBJMACROS
-#include <windows.h>
-
-#include <math.h>
-#include <stdlib.h>
+#include <stdarg.h>
+#include <stddef.h>
-#include "wine/test.h"
+#include "ntstatus.h"
+#define WIN32_NO_STATUS
#include "windef.h"
-#include "wingdi.h"
+#include "winbase.h"
+
+#define COBJMACROS
#include "dinput.h"
+#include "dinput_test.h"
+
static const HRESULT SetCoop_null_window[16] = {
E_INVALIDARG, E_INVALIDARG, E_INVALIDARG, E_INVALIDARG,
E_INVALIDARG, E_HANDLE, E_HANDLE, E_INVALIDARG,
@@ -290,11 +292,10 @@ static void mouse_tests(void)
{
HRESULT hr;
IDirectInputA *pDI = NULL;
- HINSTANCE hInstance = GetModuleHandleW(NULL);
HWND hwnd;
ULONG ref = 0;
- hr = DirectInputCreateA(hInstance, DIRECTINPUT_VERSION, &pDI, NULL);
+ hr = DirectInputCreateA(instance, DIRECTINPUT_VERSION, &pDI, NULL);
if (hr == DIERR_OLDDIRECTINPUTVERSION)
{
skip("Tests require a newer dinput version\n");
@@ -323,9 +324,9 @@ static void mouse_tests(void)
START_TEST(mouse)
{
- CoInitialize(NULL);
+ dinput_test_init();
mouse_tests();
- CoUninitialize();
+ dinput_test_exit();
}
--
GitLab
https://gitlab.winehq.org/wine/wine/-/merge_requests/208
June 9, 2022
[PATCH v2 1/3] dinput/tests: Avoid requiring foreground window in SetCooperativeLevel tests.
by Rémi Bernon
From: Rémi Bernon <rbernon(a)codeweavers.com>
Signed-off-by: Rémi Bernon <rbernon(a)codeweavers.com>
---
dlls/dinput/tests/joystick8.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/dlls/dinput/tests/joystick8.c b/dlls/dinput/tests/joystick8.c
index 070d9cc2361..e4c676c4b33 100644
--- a/dlls/dinput/tests/joystick8.c
+++ b/dlls/dinput/tests/joystick8.c
@@ -1252,7 +1252,6 @@ static void test_simple_joystick( DWORD version )
hwnd = CreateWindowW( L"static", L"dinput", WS_OVERLAPPEDWINDOW | WS_VISIBLE, 10, 10, 200, 200,
NULL, NULL, NULL, NULL );
- SetForegroundWindow( hwnd );
hr = IDirectInputDevice8_SetCooperativeLevel( device, hwnd, DISCL_FOREGROUND | DISCL_NONEXCLUSIVE );
ok( hr == DI_OK, "SetCooperativeLevel returned: %#lx\n", hr );
@@ -1261,6 +1260,8 @@ static void test_simple_joystick( DWORD version )
hr = IDirectInputDevice8_SetCooperativeLevel( device, hwnd, DISCL_FOREGROUND | DISCL_EXCLUSIVE );
ok( hr == DI_OK, "SetCooperativeLevel returned: %#lx\n", hr );
+ hr = IDirectInputDevice8_SetCooperativeLevel( device, NULL, DISCL_BACKGROUND | DISCL_NONEXCLUSIVE );
+ ok( hr == DI_OK, "SetCooperativeLevel returned: %#lx\n", hr );
hr = IDirectInputDevice8_Unacquire( device );
ok( hr == DI_NOEFFECT, "Unacquire returned: %#lx\n", hr );
hr = IDirectInputDevice8_Acquire( device );
--
GitLab
https://gitlab.winehq.org/wine/wine/-/merge_requests/208
June 9, 2022
[PATCH v2 0/3] MR208: Draft: dinput/tests: Cleanup old tests and merge more dinput8 / dinput tests together.
by Rémi Bernon
--
v2: dinput/tests: Merge device.c tests into device8.c.
dinput/tests: Use dinput_test_(init|exit) for all tests.
dinput/tests: Avoid requiring foreground window in SetCooperativeLevel tests.
https://gitlab.winehq.org/wine/wine/-/merge_requests/208
June 9, 2022