[PATCH 1/4] dinput/tests: Add tests for joystick with many axes and units.

Rémi Bernon rbernon at codeweavers.com
Thu Apr 21 12:50:17 CDT 2022


Checking that only a few axes get really mapped to the slider axes, and
that we shouldn't use HID_USAGE_SIMULATION_RUDDER if there's already an
Rz mapped axis.

Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
---
 dlls/dinput/tests/joystick8.c | 572 ++++++++++++++++++++++++++++++++++
 1 file changed, 572 insertions(+)

diff --git a/dlls/dinput/tests/joystick8.c b/dlls/dinput/tests/joystick8.c
index 597846d9f57..32d03a603c3 100644
--- a/dlls/dinput/tests/joystick8.c
+++ b/dlls/dinput/tests/joystick8.c
@@ -2621,6 +2621,577 @@ static BOOL test_device_types( DWORD version )
     return success;
 }
 
+static void test_many_axes_joystick(void)
+{
+#include "psh_hid_macros.h"
+    static const unsigned char report_desc[] =
+    {
+        USAGE_PAGE(1, HID_USAGE_PAGE_GENERIC),
+        USAGE(1, HID_USAGE_GENERIC_JOYSTICK),
+        COLLECTION(1, Application),
+            USAGE(1, HID_USAGE_GENERIC_JOYSTICK),
+            COLLECTION(1, Report),
+                REPORT_ID(1, 1),
+
+                USAGE(1, HID_USAGE_GENERIC_DIAL),
+                USAGE(1, HID_USAGE_GENERIC_SLIDER),
+                USAGE(4, (HID_USAGE_PAGE_SIMULATION<<16)|HID_USAGE_SIMULATION_RUDDER),
+                USAGE(4, (HID_USAGE_PAGE_SIMULATION<<16)|HID_USAGE_SIMULATION_THROTTLE),
+                USAGE(1, HID_USAGE_GENERIC_RZ),
+                USAGE(1, HID_USAGE_GENERIC_RY),
+                USAGE(1, HID_USAGE_GENERIC_RX),
+                USAGE(1, HID_USAGE_GENERIC_Z),
+                USAGE(1, HID_USAGE_GENERIC_Y),
+                USAGE(1, HID_USAGE_GENERIC_X),
+                LOGICAL_MINIMUM(1, 0),
+                LOGICAL_MAXIMUM(1, 0x7f),
+                PHYSICAL_MINIMUM(1, 0),
+                PHYSICAL_MAXIMUM(1, 0x7f),
+                REPORT_SIZE(1, 8),
+                REPORT_COUNT(1, 10),
+                INPUT(1, Data|Var|Abs),
+
+                USAGE(1, HID_USAGE_GENERIC_Z),
+                USAGE(1, HID_USAGE_GENERIC_Y),
+                USAGE(1, HID_USAGE_GENERIC_X),
+                LOGICAL_MINIMUM(1, 0),
+                LOGICAL_MAXIMUM(1, 0x7f),
+                PHYSICAL_MINIMUM(1, 0),
+                PHYSICAL_MAXIMUM(1, 0x7f),
+                UNIT(4, 0xf011), /* cm * s^-1 */
+                REPORT_SIZE(1, 8),
+                REPORT_COUNT(1, 3),
+                INPUT(1, Data|Var|Abs),
+
+                USAGE(1, HID_USAGE_GENERIC_Z),
+                USAGE(1, HID_USAGE_GENERIC_Y),
+                USAGE(1, HID_USAGE_GENERIC_X),
+                LOGICAL_MINIMUM(1, 0),
+                LOGICAL_MAXIMUM(1, 0x7f),
+                PHYSICAL_MINIMUM(1, 0),
+                PHYSICAL_MAXIMUM(1, 0x7f),
+                UNIT(4, 0xe011), /* cm * s^-2 */
+                REPORT_SIZE(1, 8),
+                REPORT_COUNT(1, 3),
+                INPUT(1, Data|Var|Abs),
+
+                USAGE(1, HID_USAGE_GENERIC_Z),
+                USAGE(1, HID_USAGE_GENERIC_Y),
+                USAGE(1, HID_USAGE_GENERIC_X),
+                LOGICAL_MINIMUM(1, 0),
+                LOGICAL_MAXIMUM(1, 0x7f),
+                PHYSICAL_MINIMUM(1, 0),
+                PHYSICAL_MAXIMUM(1, 0x7f),
+                UNIT(4, 0xe111), /* g * cm * s^-2 */
+                REPORT_SIZE(1, 8),
+                REPORT_COUNT(1, 3),
+                INPUT(1, Data|Var|Abs),
+                UNIT(1, 0), /* None */
+            END_COLLECTION,
+        END_COLLECTION,
+    };
+#undef REPORT_ID_OR_USAGE_PAGE
+#include "pop_hid_macros.h"
+
+    struct hid_device_desc desc =
+    {
+        .use_report_id = TRUE,
+        .caps = { .InputReportByteLength = 20 },
+        .attributes = default_attributes,
+    };
+    const DIDEVCAPS expect_caps =
+    {
+        .dwSize = sizeof(DIDEVCAPS),
+        .dwFlags = DIDC_ATTACHED | DIDC_EMULATED,
+        .dwDevType = DIDEVTYPE_HID | (DI8DEVTYPE1STPERSON_LIMITED << 8) | DI8DEVTYPE_1STPERSON,
+        .dwAxes = 19,
+    };
+    const DIDEVICEINSTANCEW expect_devinst =
+    {
+        .dwSize = sizeof(DIDEVICEINSTANCEW),
+        .guidInstance = expect_guid_product,
+        .guidProduct = expect_guid_product,
+        .dwDevType = DIDEVTYPE_HID | (DI8DEVTYPE1STPERSON_LIMITED << 8) | DI8DEVTYPE_1STPERSON,
+        .tszInstanceName = L"Wine Test",
+        .tszProductName = L"Wine Test",
+        .guidFFDriver = GUID_NULL,
+        .wUsagePage = HID_USAGE_PAGE_GENERIC,
+        .wUsage = HID_USAGE_GENERIC_JOYSTICK,
+    };
+    const DIDEVICEOBJECTINSTANCEW expect_objects[] =
+    {
+        {
+            .dwSize = sizeof(DIDEVICEOBJECTINSTANCEW),
+            .guidType = GUID_XAxis,
+            .dwOfs = 0,
+            .dwType = DIDFT_ABSAXIS|DIDFT_MAKEINSTANCE(0),
+            .dwFlags = DIDOI_ASPECTPOSITION,
+            .tszName = L"X Axis",
+            .wCollectionNumber = 1,
+            .wUsagePage = HID_USAGE_PAGE_GENERIC,
+            .wUsage = HID_USAGE_GENERIC_X,
+            .wReportId = 1,
+        },
+        {
+            .dwSize = sizeof(DIDEVICEOBJECTINSTANCEW),
+            .guidType = GUID_YAxis,
+            .dwOfs = 0x4,
+            .dwType = DIDFT_ABSAXIS|DIDFT_MAKEINSTANCE(1),
+            .dwFlags = DIDOI_ASPECTPOSITION,
+            .tszName = L"Y Axis",
+            .wCollectionNumber = 1,
+            .wUsagePage = HID_USAGE_PAGE_GENERIC,
+            .wUsage = HID_USAGE_GENERIC_Y,
+            .wReportId = 1,
+        },
+        {
+            .dwSize = sizeof(DIDEVICEOBJECTINSTANCEW),
+            .guidType = GUID_ZAxis,
+            .dwOfs = 0x8,
+            .dwType = DIDFT_ABSAXIS|DIDFT_MAKEINSTANCE(2),
+            .dwFlags = DIDOI_ASPECTPOSITION,
+            .tszName = L"Z Axis",
+            .wCollectionNumber = 1,
+            .wUsagePage = HID_USAGE_PAGE_GENERIC,
+            .wUsage = HID_USAGE_GENERIC_Z,
+            .wReportId = 1,
+        },
+        {
+            .dwSize = sizeof(DIDEVICEOBJECTINSTANCEW),
+            .guidType = GUID_RxAxis,
+            .dwOfs = 0xc,
+            .dwType = DIDFT_ABSAXIS|DIDFT_MAKEINSTANCE(3),
+            .dwFlags = DIDOI_ASPECTPOSITION,
+            .tszName = L"X Rotation",
+            .wCollectionNumber = 1,
+            .wUsagePage = HID_USAGE_PAGE_GENERIC,
+            .wUsage = HID_USAGE_GENERIC_RX,
+            .wReportId = 1,
+        },
+        {
+            .dwSize = sizeof(DIDEVICEOBJECTINSTANCEW),
+            .guidType = GUID_RyAxis,
+            .dwOfs = 0x10,
+            .dwType = DIDFT_ABSAXIS|DIDFT_MAKEINSTANCE(4),
+            .dwFlags = DIDOI_ASPECTPOSITION,
+            .tszName = L"Y Rotation",
+            .wCollectionNumber = 1,
+            .wUsagePage = HID_USAGE_PAGE_GENERIC,
+            .wUsage = HID_USAGE_GENERIC_RY,
+            .wReportId = 1,
+        },
+        {
+            .dwSize = sizeof(DIDEVICEOBJECTINSTANCEW),
+            .guidType = GUID_RzAxis,
+            .dwOfs = 0x14,
+            .dwType = DIDFT_ABSAXIS|DIDFT_MAKEINSTANCE(5),
+            .dwFlags = DIDOI_ASPECTPOSITION,
+            .tszName = L"Z Rotation",
+            .wCollectionNumber = 1,
+            .wUsagePage = HID_USAGE_PAGE_GENERIC,
+            .wUsage = HID_USAGE_GENERIC_RZ,
+            .wReportId = 1,
+        },
+        {
+            .dwSize = sizeof(DIDEVICEOBJECTINSTANCEW),
+            .guidType = GUID_Slider,
+            .dwOfs = 0x18,
+            .dwType = DIDFT_ABSAXIS|DIDFT_MAKEINSTANCE(6),
+            .dwFlags = DIDOI_ASPECTPOSITION,
+            .tszName = L"Throttle",
+            .wCollectionNumber = 1,
+            .wUsagePage = HID_USAGE_PAGE_SIMULATION,
+            .wUsage = HID_USAGE_SIMULATION_THROTTLE,
+            .wReportId = 1,
+        },
+        {
+            .dwSize = sizeof(DIDEVICEOBJECTINSTANCEW),
+            .guidType = GUID_RzAxis,
+            .dwOfs = 0x1c,
+            .dwType = DIDFT_ABSAXIS|DIDFT_MAKEINSTANCE(7),
+            .dwFlags = DIDOI_ASPECTPOSITION,
+            .tszName = L"Rudder",
+            .wCollectionNumber = 1,
+            .wUsagePage = HID_USAGE_PAGE_SIMULATION,
+            .wUsage = HID_USAGE_SIMULATION_RUDDER,
+            .wReportId = 1,
+        },
+        {
+            .dwSize = sizeof(DIDEVICEOBJECTINSTANCEW),
+            .guidType = GUID_Slider,
+            .dwOfs = 0x20,
+            .dwType = DIDFT_ABSAXIS|DIDFT_MAKEINSTANCE(8),
+            .dwFlags = DIDOI_ASPECTPOSITION,
+            .tszName = L"Slider",
+            .wCollectionNumber = 1,
+            .wUsagePage = HID_USAGE_PAGE_GENERIC,
+            .wUsage = HID_USAGE_GENERIC_SLIDER,
+            .wReportId = 1,
+        },
+        {
+            .dwSize = sizeof(DIDEVICEOBJECTINSTANCEW),
+            .guidType = GUID_Slider,
+            .dwOfs = 0x24,
+            .dwType = DIDFT_ABSAXIS|DIDFT_MAKEINSTANCE(9),
+            .dwFlags = DIDOI_ASPECTPOSITION,
+            .tszName = L"Dial",
+            .wCollectionNumber = 1,
+            .wUsagePage = HID_USAGE_PAGE_GENERIC,
+            .wUsage = HID_USAGE_GENERIC_DIAL,
+            .wReportId = 1,
+        },
+        {
+            .dwSize = sizeof(DIDEVICEOBJECTINSTANCEW),
+            .guidType = GUID_XAxis,
+            .dwOfs = 0x28,
+            .dwType = DIDFT_ABSAXIS|DIDFT_MAKEINSTANCE(10),
+            .dwFlags = DIDOI_ASPECTVELOCITY,
+            .tszName = L"X Axis",
+            .wCollectionNumber = 1,
+            .dwDimension = 0xf011,
+            .wUsagePage = HID_USAGE_PAGE_GENERIC,
+            .wUsage = HID_USAGE_GENERIC_X,
+            .wReportId = 1,
+        },
+        {
+            .dwSize = sizeof(DIDEVICEOBJECTINSTANCEW),
+            .guidType = GUID_YAxis,
+            .dwOfs = 0x2c,
+            .dwType = DIDFT_ABSAXIS|DIDFT_MAKEINSTANCE(11),
+            .dwFlags = DIDOI_ASPECTVELOCITY,
+            .tszName = L"Y Axis",
+            .wCollectionNumber = 1,
+            .dwDimension = 0xf011,
+            .wUsagePage = HID_USAGE_PAGE_GENERIC,
+            .wUsage = HID_USAGE_GENERIC_Y,
+            .wReportId = 1,
+        },
+        {
+            .dwSize = sizeof(DIDEVICEOBJECTINSTANCEW),
+            .guidType = GUID_ZAxis,
+            .dwOfs = 0x30,
+            .dwType = DIDFT_ABSAXIS|DIDFT_MAKEINSTANCE(12),
+            .dwFlags = DIDOI_ASPECTVELOCITY,
+            .tszName = L"Z Axis",
+            .wCollectionNumber = 1,
+            .dwDimension = 0xf011,
+            .wUsagePage = HID_USAGE_PAGE_GENERIC,
+            .wUsage = HID_USAGE_GENERIC_Z,
+            .wReportId = 1,
+        },
+        {
+            .dwSize = sizeof(DIDEVICEOBJECTINSTANCEW),
+            .guidType = GUID_XAxis,
+            .dwOfs = 0x34,
+            .dwType = DIDFT_ABSAXIS|DIDFT_MAKEINSTANCE(13),
+            .dwFlags = DIDOI_ASPECTACCEL,
+            .tszName = L"X Axis",
+            .wCollectionNumber = 1,
+            .dwDimension = 0xe011,
+            .wUsagePage = HID_USAGE_PAGE_GENERIC,
+            .wUsage = HID_USAGE_GENERIC_X,
+            .wReportId = 1,
+        },
+        {
+            .dwSize = sizeof(DIDEVICEOBJECTINSTANCEW),
+            .guidType = GUID_YAxis,
+            .dwOfs = 0x38,
+            .dwType = DIDFT_ABSAXIS|DIDFT_MAKEINSTANCE(14),
+            .dwFlags = DIDOI_ASPECTACCEL,
+            .tszName = L"Y Axis",
+            .wCollectionNumber = 1,
+            .dwDimension = 0xe011,
+            .wUsagePage = HID_USAGE_PAGE_GENERIC,
+            .wUsage = HID_USAGE_GENERIC_Y,
+            .wReportId = 1,
+        },
+        {
+            .dwSize = sizeof(DIDEVICEOBJECTINSTANCEW),
+            .guidType = GUID_ZAxis,
+            .dwOfs = 0x3c,
+            .dwType = DIDFT_ABSAXIS|DIDFT_MAKEINSTANCE(15),
+            .dwFlags = DIDOI_ASPECTACCEL,
+            .tszName = L"Z Axis",
+            .wCollectionNumber = 1,
+            .dwDimension = 0xe011,
+            .wUsagePage = HID_USAGE_PAGE_GENERIC,
+            .wUsage = HID_USAGE_GENERIC_Z,
+            .wReportId = 1,
+        },
+        {
+            .dwSize = sizeof(DIDEVICEOBJECTINSTANCEW),
+            .guidType = GUID_XAxis,
+            .dwOfs = 0x40,
+            .dwType = DIDFT_ABSAXIS|DIDFT_MAKEINSTANCE(16),
+            .dwFlags = DIDOI_ASPECTFORCE,
+            .tszName = L"X Axis",
+            .wCollectionNumber = 1,
+            .dwDimension = 0xe111,
+            .wUsagePage = HID_USAGE_PAGE_GENERIC,
+            .wUsage = HID_USAGE_GENERIC_X,
+            .wReportId = 1,
+        },
+        {
+            .dwSize = sizeof(DIDEVICEOBJECTINSTANCEW),
+            .guidType = GUID_YAxis,
+            .dwOfs = 0x44,
+            .dwType = DIDFT_ABSAXIS|DIDFT_MAKEINSTANCE(17),
+            .dwFlags = DIDOI_ASPECTFORCE,
+            .tszName = L"Y Axis",
+            .wCollectionNumber = 1,
+            .dwDimension = 0xe111,
+            .wUsagePage = HID_USAGE_PAGE_GENERIC,
+            .wUsage = HID_USAGE_GENERIC_Y,
+            .wReportId = 1,
+        },
+        {
+            .dwSize = sizeof(DIDEVICEOBJECTINSTANCEW),
+            .guidType = GUID_ZAxis,
+            .dwOfs = 0x48,
+            .dwType = DIDFT_ABSAXIS|DIDFT_MAKEINSTANCE(18),
+            .dwFlags = DIDOI_ASPECTFORCE,
+            .tszName = L"Z Axis",
+            .wCollectionNumber = 1,
+            .dwDimension = 0xe111,
+            .wUsagePage = HID_USAGE_PAGE_GENERIC,
+            .wUsage = HID_USAGE_GENERIC_Z,
+            .wReportId = 1,
+        },
+        {
+            .dwSize = sizeof(DIDEVICEOBJECTINSTANCEW),
+            .guidType = GUID_Unknown,
+            .dwType = DIDFT_COLLECTION|DIDFT_NODATA|DIDFT_MAKEINSTANCE(0),
+            .tszName = L"Collection 0 - Joystick",
+            .wUsagePage = HID_USAGE_PAGE_GENERIC,
+            .wUsage = HID_USAGE_GENERIC_JOYSTICK,
+        },
+        {
+            .dwSize = sizeof(DIDEVICEOBJECTINSTANCEW),
+            .guidType = GUID_Unknown,
+            .dwType = DIDFT_COLLECTION|DIDFT_NODATA|DIDFT_MAKEINSTANCE(1),
+            .tszName = L"Collection 1 - Joystick",
+            .wUsagePage = HID_USAGE_PAGE_GENERIC,
+            .wUsage = HID_USAGE_GENERIC_JOYSTICK,
+        },
+    };
+    struct check_objects_todos todo_objects[ARRAY_SIZE(expect_objects)] =
+    {
+        {0},
+        {0},
+        {0},
+        {0},
+        {0},
+        {0},
+        {0},
+        {0},
+        {.name = TRUE},
+        {.name = TRUE, .guid = TRUE},
+        {.flags = TRUE},
+        {.flags = TRUE},
+        {.flags = TRUE},
+        {.flags = TRUE},
+        {.flags = TRUE},
+        {.flags = TRUE},
+        {.flags = TRUE},
+        {.flags = TRUE},
+        {.flags = TRUE},
+    };
+    struct check_objects_params check_objects_params =
+    {
+        .version = DIRECTINPUT_VERSION,
+        .expect_count = ARRAY_SIZE(expect_objects),
+        .expect_objs = expect_objects,
+        .todo_objs = todo_objects,
+    };
+
+    DIDEVICEOBJECTINSTANCEW objinst = {.dwSize = sizeof(DIDEVICEOBJECTINSTANCEW)};
+    DIDEVICEINSTANCEW devinst = {0};
+    IDirectInputDevice8W *device;
+    DIDEVCAPS caps = {0};
+    HRESULT hr;
+    ULONG ref;
+
+    cleanup_registry_keys();
+
+    desc.report_descriptor_len = sizeof(report_desc);
+    memcpy( desc.report_descriptor_buf, report_desc, sizeof(report_desc) );
+    fill_context( __LINE__, desc.context, ARRAY_SIZE(desc.context) );
+
+    if (!hid_device_start( &desc )) goto done;
+    if (FAILED(hr = dinput_test_create_device( DIRECTINPUT_VERSION, &devinst, &device ))) goto done;
+
+    check_dinput_devices( DIRECTINPUT_VERSION, &devinst );
+
+    memset( &devinst, 0, sizeof(devinst) );
+    devinst.dwSize = sizeof(DIDEVICEINSTANCEW);
+    hr = IDirectInputDevice8_GetDeviceInfo( device, &devinst );
+    ok( hr == DI_OK, "GetDeviceInfo returned %#lx\n", hr );
+    check_member( devinst, expect_devinst, "%lu", dwSize );
+    todo_wine
+    check_member_guid( devinst, expect_devinst, guidInstance );
+    check_member_guid( devinst, expect_devinst, guidProduct );
+    todo_wine
+    check_member( devinst, expect_devinst, "%#lx", dwDevType );
+    check_member_wstr( devinst, expect_devinst, tszInstanceName );
+    check_member_wstr( devinst, expect_devinst, tszProductName );
+    check_member_guid( devinst, expect_devinst, guidFFDriver );
+    check_member( devinst, expect_devinst, "%04x", wUsagePage );
+    check_member( devinst, expect_devinst, "%04x", wUsage );
+
+    hr = IDirectInputDevice8_GetCapabilities( device, NULL );
+    ok( hr == E_POINTER, "GetCapabilities returned %#lx\n", hr );
+    hr = IDirectInputDevice8_GetCapabilities( device, &caps );
+    ok( hr == DIERR_INVALIDPARAM, "GetCapabilities returned %#lx\n", hr );
+    caps.dwSize = sizeof(DIDEVCAPS);
+    hr = IDirectInputDevice8_GetCapabilities( device, &caps );
+    ok( hr == DI_OK, "GetCapabilities returned %#lx\n", hr );
+    check_member( caps, expect_caps, "%lu", dwSize );
+    check_member( caps, expect_caps, "%#lx", dwFlags );
+    todo_wine
+    check_member( caps, expect_caps, "%#lx", dwDevType );
+    check_member( caps, expect_caps, "%lu", dwAxes );
+    check_member( caps, expect_caps, "%lu", dwButtons );
+    check_member( caps, expect_caps, "%lu", dwPOVs );
+    check_member( caps, expect_caps, "%lu", dwFFSamplePeriod );
+    check_member( caps, expect_caps, "%lu", dwFFMinTimeResolution );
+    check_member( caps, expect_caps, "%lu", dwFirmwareRevision );
+    check_member( caps, expect_caps, "%lu", dwHardwareRevision );
+    check_member( caps, expect_caps, "%lu", dwFFDriverVersion );
+
+    hr = IDirectInputDevice8_EnumObjects( device, check_objects, &check_objects_params, DIDFT_ALL );
+    ok( hr == DI_OK, "EnumObjects returned %#lx\n", hr );
+    ok( check_objects_params.index >= check_objects_params.expect_count, "missing %u objects\n",
+        check_objects_params.expect_count - check_objects_params.index );
+
+    hr = IDirectInputDevice8_SetDataFormat( device, &c_dfDIJoystick2 );
+    ok( hr == DI_OK, "SetDataFormat returned: %#lx\n", hr );
+
+    hr = IDirectInputDevice8_GetObjectInfo( device, &objinst, DIJOFS_RZ, DIPH_BYOFFSET );
+    ok( hr == DI_OK, "GetObjectInfo returned: %#lx\n", hr );
+
+    check_member( objinst, expect_objects[5], "%lu", dwSize );
+    check_member_guid( objinst, expect_objects[5], guidType );
+    check_member( objinst, expect_objects[5], "%#lx", dwOfs );
+    check_member( objinst, expect_objects[5], "%#lx", dwType );
+    check_member( objinst, expect_objects[5], "%#lx", dwFlags );
+    if (!localized) check_member_wstr( objinst, expect_objects[5], tszName );
+    check_member( objinst, expect_objects[5], "%lu", dwFFMaxForce );
+    check_member( objinst, expect_objects[5], "%lu", dwFFForceResolution );
+    check_member( objinst, expect_objects[5], "%u", wCollectionNumber );
+    check_member( objinst, expect_objects[5], "%u", wDesignatorIndex );
+    check_member( objinst, expect_objects[5], "%#04x", wUsagePage );
+    check_member( objinst, expect_objects[5], "%#04x", wUsage );
+    check_member( objinst, expect_objects[5], "%#lx", dwDimension );
+    check_member( objinst, expect_objects[5], "%#04x", wExponent );
+    check_member( objinst, expect_objects[5], "%u", wReportId );
+
+    hr = IDirectInputDevice8_GetObjectInfo( device, &objinst, offsetof(DIJOYSTATE2, rglSlider[0]), DIPH_BYOFFSET );
+    ok( hr == DI_OK, "GetObjectInfo returned: %#lx\n", hr );
+
+    check_member( objinst, expect_objects[6], "%lu", dwSize );
+    check_member_guid( objinst, expect_objects[6], guidType );
+    check_member( objinst, expect_objects[6], "%#lx", dwOfs );
+    check_member( objinst, expect_objects[6], "%#lx", dwType );
+    check_member( objinst, expect_objects[6], "%#lx", dwFlags );
+    if (!localized) check_member_wstr( objinst, expect_objects[6], tszName );
+    check_member( objinst, expect_objects[6], "%lu", dwFFMaxForce );
+    check_member( objinst, expect_objects[6], "%lu", dwFFForceResolution );
+    check_member( objinst, expect_objects[6], "%u", wCollectionNumber );
+    check_member( objinst, expect_objects[6], "%u", wDesignatorIndex );
+    check_member( objinst, expect_objects[6], "%#04x", wUsagePage );
+    check_member( objinst, expect_objects[6], "%#04x", wUsage );
+    check_member( objinst, expect_objects[6], "%#lx", dwDimension );
+    check_member( objinst, expect_objects[6], "%#04x", wExponent );
+    check_member( objinst, expect_objects[6], "%u", wReportId );
+
+    hr = IDirectInputDevice8_GetObjectInfo( device, &objinst, offsetof(DIJOYSTATE2, rglSlider[1]), DIPH_BYOFFSET );
+    ok( hr == DI_OK, "GetObjectInfo returned: %#lx\n", hr );
+
+    check_member( objinst, expect_objects[8], "%lu", dwSize );
+    check_member_guid( objinst, expect_objects[8], guidType );
+    check_member( objinst, expect_objects[8], "%#lx", dwOfs );
+    check_member( objinst, expect_objects[8], "%#lx", dwType );
+    check_member( objinst, expect_objects[8], "%#lx", dwFlags );
+    if (!localized) todo_wine check_member_wstr( objinst, expect_objects[8], tszName );
+    check_member( objinst, expect_objects[8], "%lu", dwFFMaxForce );
+    check_member( objinst, expect_objects[8], "%lu", dwFFForceResolution );
+    check_member( objinst, expect_objects[8], "%u", wCollectionNumber );
+    check_member( objinst, expect_objects[8], "%u", wDesignatorIndex );
+    check_member( objinst, expect_objects[8], "%#04x", wUsagePage );
+    check_member( objinst, expect_objects[8], "%#04x", wUsage );
+    check_member( objinst, expect_objects[8], "%#lx", dwDimension );
+    check_member( objinst, expect_objects[8], "%#04x", wExponent );
+    check_member( objinst, expect_objects[8], "%u", wReportId );
+
+    hr = IDirectInputDevice8_GetObjectInfo( device, &objinst, offsetof(DIJOYSTATE2, lVX), DIPH_BYOFFSET );
+    ok( hr == DI_OK, "GetObjectInfo returned: %#lx\n", hr );
+
+    check_member( objinst, expect_objects[10], "%lu", dwSize );
+    check_member_guid( objinst, expect_objects[10], guidType );
+    check_member( objinst, expect_objects[10], "%#lx", dwOfs );
+    check_member( objinst, expect_objects[10], "%#lx", dwType );
+    todo_wine
+    check_member( objinst, expect_objects[10], "%#lx", dwFlags );
+    if (!localized) check_member_wstr( objinst, expect_objects[10], tszName );
+    check_member( objinst, expect_objects[10], "%lu", dwFFMaxForce );
+    check_member( objinst, expect_objects[10], "%lu", dwFFForceResolution );
+    check_member( objinst, expect_objects[10], "%u", wCollectionNumber );
+    check_member( objinst, expect_objects[10], "%u", wDesignatorIndex );
+    check_member( objinst, expect_objects[10], "%#04x", wUsagePage );
+    check_member( objinst, expect_objects[10], "%#04x", wUsage );
+    check_member( objinst, expect_objects[10], "%#lx", dwDimension );
+    check_member( objinst, expect_objects[10], "%#04x", wExponent );
+    check_member( objinst, expect_objects[10], "%u", wReportId );
+
+    hr = IDirectInputDevice8_GetObjectInfo( device, &objinst, offsetof(DIJOYSTATE2, lAX), DIPH_BYOFFSET );
+    ok( hr == DI_OK, "GetObjectInfo returned: %#lx\n", hr );
+
+    check_member( objinst, expect_objects[13], "%lu", dwSize );
+    check_member_guid( objinst, expect_objects[13], guidType );
+    check_member( objinst, expect_objects[13], "%#lx", dwOfs );
+    check_member( objinst, expect_objects[13], "%#lx", dwType );
+    todo_wine
+    check_member( objinst, expect_objects[13], "%#lx", dwFlags );
+    if (!localized) check_member_wstr( objinst, expect_objects[13], tszName );
+    check_member( objinst, expect_objects[13], "%lu", dwFFMaxForce );
+    check_member( objinst, expect_objects[13], "%lu", dwFFForceResolution );
+    check_member( objinst, expect_objects[13], "%u", wCollectionNumber );
+    check_member( objinst, expect_objects[13], "%u", wDesignatorIndex );
+    check_member( objinst, expect_objects[13], "%#04x", wUsagePage );
+    check_member( objinst, expect_objects[13], "%#04x", wUsage );
+    check_member( objinst, expect_objects[13], "%#lx", dwDimension );
+    check_member( objinst, expect_objects[13], "%#04x", wExponent );
+    check_member( objinst, expect_objects[13], "%u", wReportId );
+
+    hr = IDirectInputDevice8_GetObjectInfo( device, &objinst, offsetof(DIJOYSTATE2, lFX), DIPH_BYOFFSET );
+    ok( hr == DI_OK, "GetObjectInfo returned: %#lx\n", hr );
+
+    check_member( objinst, expect_objects[16], "%lu", dwSize );
+    check_member_guid( objinst, expect_objects[16], guidType );
+    check_member( objinst, expect_objects[16], "%#lx", dwOfs );
+    check_member( objinst, expect_objects[16], "%#lx", dwType );
+    todo_wine
+    check_member( objinst, expect_objects[16], "%#lx", dwFlags );
+    if (!localized) check_member_wstr( objinst, expect_objects[16], tszName );
+    check_member( objinst, expect_objects[16], "%lu", dwFFMaxForce );
+    check_member( objinst, expect_objects[16], "%lu", dwFFForceResolution );
+    check_member( objinst, expect_objects[16], "%u", wCollectionNumber );
+    check_member( objinst, expect_objects[16], "%u", wDesignatorIndex );
+    check_member( objinst, expect_objects[16], "%#04x", wUsagePage );
+    check_member( objinst, expect_objects[16], "%#04x", wUsage );
+    check_member( objinst, expect_objects[16], "%#lx", dwDimension );
+    check_member( objinst, expect_objects[16], "%#04x", wExponent );
+    check_member( objinst, expect_objects[16], "%u", wReportId );
+
+    ref = IDirectInputDevice8_Release( device );
+    ok( ref == 0, "Release returned %ld\n", ref );
+
+done:
+    hid_device_stop( &desc );
+    cleanup_registry_keys();
+    winetest_pop_context();
+}
+
 static void test_driving_wheel_axes(void)
 {
 #include "psh_hid_macros.h"
@@ -3488,6 +4059,7 @@ START_TEST( joystick8 )
         test_simple_joystick( 0x700 );
         test_simple_joystick( 0x800 );
 
+        test_many_axes_joystick();
         test_driving_wheel_axes();
         test_windows_gaming_input();
     }
-- 
2.35.1




More information about the wine-devel mailing list