[PATCH 3/5] ntoskrnl.exe/tests: Add some HidP_Get(Specific)ValueCaps tests.
Rémi Bernon
rbernon at codeweavers.com
Thu Jun 10 03:06:26 CDT 2021
Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
---
dlls/ntoskrnl.exe/tests/ntoskrnl.c | 199 +++++++++++++++++++++++++++++
1 file changed, 199 insertions(+)
diff --git a/dlls/ntoskrnl.exe/tests/ntoskrnl.c b/dlls/ntoskrnl.exe/tests/ntoskrnl.c
index b61d9b33a6f..c931f5a02d0 100644
--- a/dlls/ntoskrnl.exe/tests/ntoskrnl.c
+++ b/dlls/ntoskrnl.exe/tests/ntoskrnl.c
@@ -1569,6 +1569,61 @@ static inline void check_hidp_button_caps_(int line, HIDP_BUTTON_CAPS *caps, con
}
}
+#define check_hidp_value_caps(a, b) check_hidp_value_caps_(__LINE__, a, b)
+static inline void check_hidp_value_caps_(int line, HIDP_VALUE_CAPS *caps, const HIDP_VALUE_CAPS *exp)
+{
+ check_member_(__FILE__, line, *caps, *exp, "%04x", UsagePage);
+ check_member_(__FILE__, line, *caps, *exp, "%d", ReportID);
+ check_member_(__FILE__, line, *caps, *exp, "%d", IsAlias);
+ check_member_(__FILE__, line, *caps, *exp, "%d", BitField);
+ check_member_(__FILE__, line, *caps, *exp, "%d", LinkCollection);
+ check_member_(__FILE__, line, *caps, *exp, "%d", LinkUsage);
+ check_member_(__FILE__, line, *caps, *exp, "%d", LinkUsagePage);
+ check_member_(__FILE__, line, *caps, *exp, "%d", IsRange);
+ check_member_(__FILE__, line, *caps, *exp, "%d", IsStringRange);
+ check_member_(__FILE__, line, *caps, *exp, "%d", IsDesignatorRange);
+ check_member_(__FILE__, line, *caps, *exp, "%d", IsAbsolute);
+
+ check_member_(__FILE__, line, *caps, *exp, "%d", HasNull);
+ check_member_(__FILE__, line, *caps, *exp, "%d", BitSize);
+ check_member_(__FILE__, line, *caps, *exp, "%d", ReportCount);
+ check_member_(__FILE__, line, *caps, *exp, "%d", UnitsExp);
+ check_member_(__FILE__, line, *caps, *exp, "%d", Units);
+ check_member_(__FILE__, line, *caps, *exp, "%d", LogicalMin);
+ check_member_(__FILE__, line, *caps, *exp, "%d", LogicalMax);
+ check_member_(__FILE__, line, *caps, *exp, "%d", PhysicalMin);
+ check_member_(__FILE__, line, *caps, *exp, "%d", PhysicalMax);
+
+ if (!caps->IsRange && !exp->IsRange)
+ {
+ check_member_(__FILE__, line, *caps, *exp, "%04x", NotRange.Usage);
+ check_member_(__FILE__, line, *caps, *exp, "%d", NotRange.DataIndex);
+ }
+ else if (caps->IsRange && exp->IsRange)
+ {
+ check_member_(__FILE__, line, *caps, *exp, "%04x", Range.UsageMin);
+ check_member_(__FILE__, line, *caps, *exp, "%04x", Range.UsageMax);
+ check_member_(__FILE__, line, *caps, *exp, "%d", Range.DataIndexMin);
+ check_member_(__FILE__, line, *caps, *exp, "%d", Range.DataIndexMax);
+ }
+
+ if (!caps->IsRange && !exp->IsRange)
+ check_member_(__FILE__, line, *caps, *exp, "%d", NotRange.StringIndex);
+ else if (caps->IsStringRange && exp->IsStringRange)
+ {
+ check_member_(__FILE__, line, *caps, *exp, "%d", Range.StringMin);
+ check_member_(__FILE__, line, *caps, *exp, "%d", Range.StringMax);
+ }
+
+ if (!caps->IsDesignatorRange && !exp->IsDesignatorRange)
+ check_member_(__FILE__, line, *caps, *exp, "%d", NotRange.DesignatorIndex);
+ else if (caps->IsDesignatorRange && exp->IsDesignatorRange)
+ {
+ check_member_(__FILE__, line, *caps, *exp, "%d", Range.DesignatorMin);
+ check_member_(__FILE__, line, *caps, *exp, "%d", Range.DesignatorMax);
+ }
+}
+
static void test_hidp(HANDLE file)
{
static const HIDP_CAPS expect_hidp_caps =
@@ -1596,9 +1651,52 @@ static void test_hidp(HANDLE file)
.Range.DataIndexMax = 9,
},
};
+ static const HIDP_VALUE_CAPS expect_value_caps[] =
+ {
+ {
+ .UsagePage = HID_USAGE_PAGE_GENERIC,
+ .BitField = 2,
+ .LinkUsage = HID_USAGE_GENERIC_JOYSTICK,
+ .LinkUsagePage = HID_USAGE_PAGE_GENERIC,
+ .IsAbsolute = TRUE,
+ .BitSize = 8,
+ .ReportCount = 1,
+ .LogicalMin = -128,
+ .LogicalMax = 127,
+ .NotRange.Usage = HID_USAGE_GENERIC_Y,
+ },
+ {
+ .UsagePage = HID_USAGE_PAGE_GENERIC,
+ .BitField = 2,
+ .LinkUsage = HID_USAGE_GENERIC_JOYSTICK,
+ .LinkUsagePage = HID_USAGE_PAGE_GENERIC,
+ .IsAbsolute = TRUE,
+ .BitSize = 8,
+ .ReportCount = 1,
+ .LogicalMin = -128,
+ .LogicalMax = 127,
+ .NotRange.Usage = HID_USAGE_GENERIC_X,
+ .NotRange.DataIndex = 1,
+ },
+ {
+ .UsagePage = HID_USAGE_PAGE_GENERIC,
+ .BitField = 2,
+ .LinkUsage = HID_USAGE_GENERIC_JOYSTICK,
+ .LinkUsagePage = HID_USAGE_PAGE_GENERIC,
+ .IsAbsolute = TRUE,
+ .BitSize = 4,
+ .ReportCount = 2,
+ .LogicalMin = 1,
+ .LogicalMax = 8,
+ .PhysicalMax = 8,
+ .NotRange.Usage = HID_USAGE_GENERIC_HATSWITCH,
+ .NotRange.DataIndex = 10,
+ },
+ };
PHIDP_PREPARSED_DATA preparsed_data;
HIDP_BUTTON_CAPS button_caps[16];
+ HIDP_VALUE_CAPS value_caps[16];
char buffer[200];
NTSTATUS status;
HIDP_CAPS caps;
@@ -1708,6 +1806,107 @@ static void test_hidp(HANDLE file)
ok(status == HIDP_STATUS_USAGE_NOT_FOUND, "HidP_GetSpecificButtonCaps returned %#x\n", status);
ok(count == 0, "HidP_GetSpecificButtonCaps returned count %d, expected %d\n", count, 0);
+ count = ARRAY_SIZE(value_caps);
+ status = HidP_GetValueCaps(HidP_Output, value_caps, &count, preparsed_data);
+ todo_wine
+ ok(status == HIDP_STATUS_USAGE_NOT_FOUND, "HidP_GetValueCaps returned %#x\n", status);
+ status = HidP_GetValueCaps(HidP_Feature + 1, value_caps, &count, preparsed_data);
+ ok(status == HIDP_STATUS_INVALID_REPORT_TYPE, "HidP_GetValueCaps returned %#x\n", status);
+ count = 0;
+ status = HidP_GetValueCaps(HidP_Input, value_caps, &count, preparsed_data);
+ todo_wine
+ ok(status == HIDP_STATUS_BUFFER_TOO_SMALL, "HidP_GetValueCaps returned %#x\n", status);
+ todo_wine
+ ok(count == caps.NumberInputValueCaps, "HidP_GetValueCaps returned count %d, expected %d\n",
+ count, caps.NumberInputValueCaps);
+ count = ARRAY_SIZE(value_caps);
+ status = HidP_GetValueCaps(HidP_Input, value_caps, &count, (PHIDP_PREPARSED_DATA)buffer);
+ ok(status == HIDP_STATUS_INVALID_PREPARSED_DATA, "HidP_GetValueCaps returned %#x\n", status);
+ status = HidP_GetValueCaps(HidP_Input, value_caps, &count, preparsed_data);
+ ok(status == HIDP_STATUS_SUCCESS, "HidP_GetValueCaps returned %#x\n", status);
+ ok(count == caps.NumberInputValueCaps, "HidP_GetValueCaps returned count %d, expected %d\n",
+ count, caps.NumberInputValueCaps);
+
+ for (i = 0; i < ARRAY_SIZE(expect_value_caps); ++i)
+ {
+ winetest_push_context("value_caps[%d]", i);
+ check_member(value_caps[i], expect_value_caps[i], "%04x", UsagePage);
+ check_member(value_caps[i], expect_value_caps[i], "%d", ReportID);
+ check_member(value_caps[i], expect_value_caps[i], "%d", IsAlias);
+ todo_wine
+ check_member(value_caps[i], expect_value_caps[i], "%d", BitField);
+ check_member(value_caps[i], expect_value_caps[i], "%d", LinkCollection);
+ check_member(value_caps[i], expect_value_caps[i], "%04x", LinkUsage);
+ check_member(value_caps[i], expect_value_caps[i], "%04x", LinkUsagePage);
+ check_member(value_caps[i], expect_value_caps[i], "%d", IsRange);
+ check_member(value_caps[i], expect_value_caps[i], "%d", IsStringRange);
+ check_member(value_caps[i], expect_value_caps[i], "%d", IsDesignatorRange);
+ check_member(value_caps[i], expect_value_caps[i], "%d", IsAbsolute);
+ check_member(value_caps[i], expect_value_caps[i], "%d", HasNull);
+ check_member(value_caps[i], expect_value_caps[i], "%d", BitSize);
+ check_member(value_caps[i], expect_value_caps[i], "%d", ReportCount);
+ check_member(value_caps[i], expect_value_caps[i], "%d", UnitsExp);
+ check_member(value_caps[i], expect_value_caps[i], "%d", Units);
+ check_member(value_caps[i], expect_value_caps[i], "%d", LogicalMin);
+ check_member(value_caps[i], expect_value_caps[i], "%d", LogicalMax);
+ check_member(value_caps[i], expect_value_caps[i], "%d", PhysicalMin);
+ check_member(value_caps[i], expect_value_caps[i], "%d", PhysicalMax);
+ todo_wine_if(i != 2)
+ check_member(value_caps[i], expect_value_caps[i], "%04x", NotRange.Usage);
+ check_member(value_caps[i], expect_value_caps[i], "%d", NotRange.StringIndex);
+ check_member(value_caps[i], expect_value_caps[i], "%d", NotRange.DesignatorIndex);
+ check_member(value_caps[i], expect_value_caps[i], "%d", NotRange.DataIndex);
+ winetest_pop_context();
+ }
+
+ count = ARRAY_SIZE(value_caps) - 3;
+ status = HidP_GetSpecificValueCaps(HidP_Output, 0, 0, 0, value_caps, &count, preparsed_data);
+ todo_wine
+ ok(status == HIDP_STATUS_USAGE_NOT_FOUND, "HidP_GetSpecificValueCaps returned %#x\n", status);
+ status = HidP_GetSpecificValueCaps(HidP_Feature + 1, 0, 0, 0, value_caps, &count, preparsed_data);
+ ok(status == HIDP_STATUS_INVALID_REPORT_TYPE, "HidP_GetSpecificValueCaps returned %#x\n", status);
+ count = 0;
+ status = HidP_GetSpecificValueCaps(HidP_Input, 0, 0, 0, value_caps, &count, preparsed_data);
+ todo_wine
+ ok(status == HIDP_STATUS_BUFFER_TOO_SMALL, "HidP_GetSpecificValueCaps returned %#x\n", status);
+ todo_wine
+ ok(count == caps.NumberInputValueCaps, "HidP_GetSpecificValueCaps returned count %d, expected %d\n",
+ count, caps.NumberInputValueCaps);
+ count = ARRAY_SIZE(value_caps) - 3;
+ status = HidP_GetSpecificValueCaps(HidP_Input, 0, 0, 0, value_caps + 3, &count, (PHIDP_PREPARSED_DATA)buffer);
+ ok(status == HIDP_STATUS_INVALID_PREPARSED_DATA, "HidP_GetSpecificValueCaps returned %#x\n", status);
+
+ status = HidP_GetSpecificValueCaps(HidP_Input, 0, 0, 0, value_caps + 3, &count, preparsed_data);
+ ok(status == HIDP_STATUS_SUCCESS, "HidP_GetSpecificValueCaps returned %#x\n", status);
+ ok(count == caps.NumberInputValueCaps, "HidP_GetSpecificValueCaps returned count %d, expected %d\n",
+ count, caps.NumberInputValueCaps);
+ check_hidp_value_caps(&value_caps[3], &value_caps[0]);
+ check_hidp_value_caps(&value_caps[4], &value_caps[1]);
+ check_hidp_value_caps(&value_caps[5], &value_caps[2]);
+
+ count = 1;
+ status = HidP_GetSpecificValueCaps(HidP_Input, HID_USAGE_PAGE_GENERIC, 0, HID_USAGE_GENERIC_HATSWITCH,
+ value_caps + 3, &count, preparsed_data);
+ ok(status == HIDP_STATUS_SUCCESS, "HidP_GetSpecificValueCaps returned %#x\n", status);
+ ok(count == 1, "HidP_GetSpecificValueCaps returned count %d, expected %d\n", count, 1);
+ check_hidp_value_caps(&value_caps[3], &value_caps[2]);
+
+ count = 0xdead;
+ status = HidP_GetSpecificValueCaps(HidP_Input, 0xfffe, 0, 0, value_caps, &count, preparsed_data);
+ todo_wine
+ ok(status == HIDP_STATUS_USAGE_NOT_FOUND, "HidP_GetSpecificValueCaps returned %#x\n", status);
+ ok(count == 0, "HidP_GetSpecificValueCaps returned count %d, expected %d\n", count, 0);
+ count = 0xdead;
+ status = HidP_GetSpecificValueCaps(HidP_Input, 0, 0xfffe, 0, value_caps, &count, preparsed_data);
+ todo_wine
+ ok(status == HIDP_STATUS_USAGE_NOT_FOUND, "HidP_GetSpecificValueCaps returned %#x\n", status);
+ ok(count == 0, "HidP_GetSpecificValueCaps returned count %d, expected %d\n", count, 0);
+ count = 0xdead;
+ status = HidP_GetSpecificValueCaps(HidP_Input, 0, 0, 0xfffe, value_caps, &count, preparsed_data);
+ todo_wine
+ ok(status == HIDP_STATUS_USAGE_NOT_FOUND, "HidP_GetSpecificValueCaps returned %#x\n", status);
+ ok(count == 0, "HidP_GetSpecificValueCaps returned count %d, expected %d\n", count, 0);
+
HidD_FreePreparsedData(preparsed_data);
CloseHandle(file);
}
--
2.31.0
More information about the wine-devel
mailing list