From: Ziqing Hui Subject: [PATCH v2 1/3] d2d1/tests: Add tests for system property name, type, value size. Message-Id: Date: Wed, 29 Jun 2022 03:30:02 +0000 In-Reply-To: References: From: Ziqing Hui Signed-off-by: Ziqing Hui --- dlls/d2d1/tests/d2d1.c | 97 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 95 insertions(+), 2 deletions(-) diff --git a/dlls/d2d1/tests/d2d1.c b/dlls/d2d1/tests/d2d1.c index 6ba4d8cec59..d31cd9cf1a3 100644 --- a/dlls/d2d1/tests/d2d1.c +++ b/dlls/d2d1/tests/d2d1.c @@ -10314,7 +10314,85 @@ static void test_mt_factory(BOOL d3d11) ID2D1Factory_Release(factory); } -static void test_effect(BOOL d3d11) +#define check_system_properties(effect, is_builtin) check_system_properties_(__LINE__, effect, is_builtin) +static void check_system_properties_(unsigned int line, ID2D1Effect *effect, BOOL is_builtin) +{ + UINT i, value_size, str_size; + WCHAR name[32], buffer[256]; + D2D1_PROPERTY_TYPE type; + HRESULT hr; + + const struct system_property_test + { + UINT32 index; + const WCHAR *name; + D2D1_PROPERTY_TYPE type; + UINT32 value_size; + } + system_property_tests[] = + { + {D2D1_PROPERTY_CLSID, L"CLSID", D2D1_PROPERTY_TYPE_CLSID, sizeof(CLSID)}, + {D2D1_PROPERTY_DISPLAYNAME, L"DisplayName", D2D1_PROPERTY_TYPE_STRING, 0}, + {D2D1_PROPERTY_AUTHOR, L"Author", D2D1_PROPERTY_TYPE_STRING, 0}, + {D2D1_PROPERTY_CATEGORY, L"Category", D2D1_PROPERTY_TYPE_STRING, 0}, + {D2D1_PROPERTY_DESCRIPTION, L"Description", D2D1_PROPERTY_TYPE_STRING, 0}, + {D2D1_PROPERTY_INPUTS, L"Inputs", D2D1_PROPERTY_TYPE_ARRAY, sizeof(UINT32)}, + {D2D1_PROPERTY_CACHED, L"Cached", D2D1_PROPERTY_TYPE_BOOL, sizeof(BOOL)}, + {D2D1_PROPERTY_PRECISION, L"Precision", D2D1_PROPERTY_TYPE_ENUM, sizeof(UINT32)}, + {D2D1_PROPERTY_MIN_INPUTS, L"MinInputs", D2D1_PROPERTY_TYPE_UINT32, sizeof(UINT32)}, + {D2D1_PROPERTY_MAX_INPUTS, L"MaxInputs", D2D1_PROPERTY_TYPE_UINT32, sizeof(UINT32)}, + }; + + hr = ID2D1Effect_GetPropertyName(effect, 0xdeadbeef, name, sizeof(name)); + ok_(__FILE__, line)(hr == D2DERR_INVALID_PROPERTY, "GetPropertyName() got unexpected hr %#lx for 0xdeadbeef.\n", hr); + type = ID2D1Effect_GetType(effect, 0xdeadbeef); + ok_(__FILE__, line)(type == D2D1_PROPERTY_TYPE_UNKNOWN, "Got unexpected property type %#x for 0xdeadbeef.\n", type); + value_size = ID2D1Effect_GetValueSize(effect, 0xdeadbeef); + ok_(__FILE__, line)(value_size == 0, "Got unexpected value size %u for 0xdeadbeef.\n", value_size); + + for (i = 0; i < ARRAY_SIZE(system_property_tests); ++i) + { + const struct system_property_test *test = &system_property_tests[i]; + winetest_push_context("Property %u", i); + + name[0] = 0; + hr = ID2D1Effect_GetPropertyName(effect, test->index, name, sizeof(name)); + todo_wine_if(test->type == D2D1_PROPERTY_TYPE_ARRAY || (is_builtin && test->type == D2D1_PROPERTY_TYPE_STRING)) + { + ok_(__FILE__, line)(hr == S_OK, "Failed to get property name, hr %#lx\n", hr); + ok_(__FILE__, line)(!wcscmp(name, test->name), "Got unexpected property name %s, expected %s.\n", + debugstr_w(name), debugstr_w(test->name)); + } + + type = D2D1_PROPERTY_TYPE_UNKNOWN; + type = ID2D1Effect_GetType(effect, test->index); + todo_wine_if(test->type == D2D1_PROPERTY_TYPE_ARRAY || (is_builtin && test->type == D2D1_PROPERTY_TYPE_STRING)) + ok_(__FILE__, line)(type == test->type, "Got unexpected property type %#x, expected %#x.\n", + type, test->type); + + value_size = 0; + value_size = ID2D1Effect_GetValueSize(effect, test->index); + if (test->value_size != 0) + { + todo_wine_if(test->type == D2D1_PROPERTY_TYPE_ARRAY) + ok_(__FILE__, line)(value_size == test->value_size, "Got unexpected value size %u, expected %u.\n", + value_size, test->value_size); + } + else if (test->type == D2D1_PROPERTY_TYPE_STRING) + { + hr = ID2D1Effect_GetValue(effect, test->index, D2D1_PROPERTY_TYPE_STRING, (BYTE *)buffer, sizeof(buffer)); + todo_wine_if(is_builtin) + ok_(__FILE__, line)(hr == S_OK, "Failed to get value, hr %#lx.\n", hr); + str_size = (wcslen((WCHAR *)buffer) + 1) * sizeof(WCHAR); + todo_wine_if(is_builtin || buffer[0] == 0) + ok_(__FILE__, line)(value_size == str_size, "Got unexpected value size %u, expected %u.\n", + value_size, str_size); + } + winetest_pop_context(); + } +} + +static void test_builtin_effect(BOOL d3d11) { unsigned int i, j, min_inputs, max_inputs, str_size, input_count; D2D1_BITMAP_PROPERTIES bitmap_desc; @@ -10376,6 +10454,7 @@ static void test_effect(BOOL d3d11) hr = ID2D1DeviceContext_CreateEffect(context, test->clsid, &effect); ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); + /* Test output image pointer */ hr = ID2D1Effect_QueryInterface(effect, &IID_ID2D1Image, (void **)&image_a); ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); ID2D1Effect_GetOutput(effect, &image_b); @@ -10383,6 +10462,7 @@ static void test_effect(BOOL d3d11) ID2D1Image_Release(image_b); ID2D1Image_Release(image_a); + /* Test GetValue() */ hr = ID2D1Effect_GetValue(effect, 0xdeadbeef, D2D1_PROPERTY_TYPE_CLSID, (BYTE *)&clsid, sizeof(clsid)); ok(hr == D2DERR_INVALID_PROPERTY, "Got unexpected hr %#lx.\n", hr); @@ -10439,10 +10519,12 @@ static void test_effect(BOOL d3d11) ok(max_inputs == test->max_inputs, "Got unexpected max inputs %u, expected %u.\n", max_inputs, test->max_inputs); + /* Test default input count */ input_count = ID2D1Effect_GetInputCount(effect); ok(input_count == test->default_input_count, "Got unexpected input count %u, expected %u.\n", input_count, test->default_input_count); + /* Test SetInputCount() */ input_count = (test->max_inputs < 16 ? test->max_inputs : 16); for (j = 0; j < input_count + 4; ++j) { @@ -10455,6 +10537,7 @@ static void test_effect(BOOL d3d11) winetest_pop_context(); } + /* Test GetInput() before any input is set */ input_count = ID2D1Effect_GetInputCount(effect); for (j = 0; j < input_count + 4; ++j) { @@ -10464,6 +10547,7 @@ static void test_effect(BOOL d3d11) winetest_pop_context(); } + /* Test GetInput() after an input is set */ set_size_u(&size, 1, 1); bitmap_desc.pixelFormat.format = DXGI_FORMAT_B8G8R8A8_UNORM; bitmap_desc.pixelFormat.alphaMode = D2D1_ALPHA_MODE_IGNORE; @@ -10490,6 +10574,7 @@ static void test_effect(BOOL d3d11) winetest_pop_context(); } + /* Test setting inputs with out-of-bounds index */ for (j = input_count; j < input_count + 4; ++j) { winetest_push_context("Input %u", j); @@ -10990,6 +11075,8 @@ static void test_effect_properties(BOOL d3d11) hr = ID2D1DeviceContext_CreateEffect(ctx.context, &CLSID_TestEffect, &effect); ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); + check_system_properties(effect, FALSE); + hr = ID2D1Effect_GetValue(effect, D2D1_PROPERTY_CLSID, D2D1_PROPERTY_TYPE_CLSID, (BYTE *)&clsid, sizeof(clsid)); ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); @@ -11252,6 +11339,8 @@ static void test_effect_2d_affine(BOOL d3d11) hr = ID2D1DeviceContext_CreateEffect(context, &CLSID_D2D12DAffineTransform, &effect); ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); + check_system_properties(effect, TRUE); + for (i = 0; i < ARRAY_SIZE(effect_2d_affine_tests); ++i) { const struct effect_2d_affine_test *test = &effect_2d_affine_tests[i]; @@ -11362,6 +11451,8 @@ static void test_effect_crop(BOOL d3d11) hr = ID2D1DeviceContext_CreateEffect(context, &CLSID_D2D1Crop, &effect); ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); + check_system_properties(effect, TRUE); + for (i = 0; i < ARRAY_SIZE(crop_effect_tests); ++i) { const struct crop_effect_test *test = &crop_effect_tests[i]; @@ -11435,6 +11526,8 @@ static void test_effect_grayscale(BOOL d3d11) hr = ID2D1DeviceContext_CreateEffect(context, &CLSID_D2D1Grayscale, &effect); ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); + check_system_properties(effect, TRUE); + for (i = 0; i < ARRAY_SIZE(test_pixels); ++i) { DWORD pixel = test_pixels[i]; @@ -12288,7 +12381,7 @@ START_TEST(d2d1) queue_test(test_effect_register); queue_test(test_effect_context); queue_test(test_effect_properties); - queue_test(test_effect); + queue_test(test_builtin_effect); queue_test(test_effect_2d_affine); queue_test(test_effect_crop); queue_test(test_effect_grayscale); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/330