ole32/tests: Add extendable tests for generic composite simplification.

Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Nikolay Sivov 2021-09-23 13:53:10 +03:00 committed by Alexandre Julliard
parent 5c18aa58d3
commit 6bc9f83ddf
1 changed files with 98 additions and 73 deletions

View File

@ -68,15 +68,6 @@ DEFINE_OLEGUID(CLSID_CompositeMoniker, 0x309, 0, 0);
DEFINE_OLEGUID(CLSID_ClassMoniker, 0x31a, 0, 0);
DEFINE_OLEGUID(CLSID_PointerMoniker, 0x306, 0, 0);
#define EXPECT_REF(obj,ref) _expect_ref((IUnknown *)obj, ref, __LINE__)
static void _expect_ref(IUnknown* obj, ULONG ref, int line)
{
ULONG refcount;
IUnknown_AddRef(obj);
refcount = IUnknown_Release(obj);
ok_(__FILE__, line)(refcount == ref, "Unexpected got %u.\n", refcount);
}
#define TEST_MONIKER_TYPE_TODO(m,t) _test_moniker_type(m, t, TRUE, __LINE__)
#define TEST_MONIKER_TYPE(m,t) _test_moniker_type(m, t, FALSE, __LINE__)
static void _test_moniker_type(IMoniker *moniker, DWORD type, BOOL todo, int line)
@ -2902,9 +2893,65 @@ todo_wine
IMoniker_Release(moniker2);
}
static HRESULT create_moniker_from_desc(const char *desc, unsigned int *eaten,
IMoniker **moniker)
{
IMoniker *left, *right;
WCHAR nameW[3];
HRESULT hr;
desc += *eaten;
switch (*desc)
{
case 'I':
nameW[0] = desc[0];
nameW[1] = desc[1];
nameW[2] = 0;
*eaten += 2;
return CreateItemMoniker(L"!", nameW, moniker);
case 'A':
*eaten += 2;
*moniker = create_antimoniker(desc[1] - '0');
return S_OK;
case 'C':
(*eaten)++;
hr = create_moniker_from_desc(desc, eaten, &left);
ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
hr = create_moniker_from_desc(desc, eaten, &right);
ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
hr = CreateGenericComposite(left, right, moniker);
IMoniker_Release(left);
IMoniker_Release(right);
return hr;
default:
ok(0, "Unexpected description %s.\n", desc);
return E_NOTIMPL;
}
}
static void test_generic_composite_moniker(void)
{
IMoniker *moniker, *inverse, *inverse2, *moniker1, *moniker2, *moniker3, *moniker4;
static const struct simplify_test
{
const char *left;
const char *right;
unsigned int result_type;
const WCHAR *name;
}
simplify_tests[] =
{
{ "I1", "I2", MKSYS_GENERICCOMPOSITE, L"!I1!I2" },
{ "I1", "A2", MKSYS_ANTIMONIKER, L"\\.." },
{ "A1", "A1", MKSYS_GENERICCOMPOSITE, L"\\..\\.." },
{ "A2", "A1", MKSYS_GENERICCOMPOSITE, L"\\..\\..\\.." },
{ "CI1I2", "A1", MKSYS_ITEMMONIKER, L"!I1" },
{ "I1", "A1", MKSYS_NONE },
{ "CI1I2", "A2", MKSYS_NONE },
{ "CI1I2", "A3", MKSYS_ANTIMONIKER, L"\\.." },
{ "CI1I3", "CA1I2", MKSYS_GENERICCOMPOSITE, L"!I1!I2" },
};
IMoniker *moniker, *inverse, *moniker1, *moniker2;
IEnumMoniker *enummoniker;
IRunningObjectTable *rot;
DWORD hash, cookie;
@ -2915,12 +2962,52 @@ static void test_generic_composite_moniker(void)
IROTData *rotdata;
IMarshal *marshal;
IStream *stream;
unsigned int i;
WCHAR *str;
ULONG len;
hr = CreateBindCtx(0, &bindctx);
ok(hr == S_OK, "Failed to create bind context, hr %#x.\n", hr);
for (i = 0; i < ARRAY_SIZE(simplify_tests); ++i)
{
IMoniker *left, *right, *composite = NULL;
unsigned int moniker_type, eaten;
WCHAR *name;
winetest_push_context("simplify[%u]", i);
eaten = 0;
hr = create_moniker_from_desc(simplify_tests[i].left, &eaten, &left);
ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
eaten = 0;
hr = create_moniker_from_desc(simplify_tests[i].right, &eaten, &right);
ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
hr = CreateGenericComposite(left, right, &composite);
ok(hr == S_OK, "Failed to create a composite, hr %#x.\n", hr);
if (composite)
{
hr = IMoniker_IsSystemMoniker(composite, &moniker_type);
ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
ok(moniker_type == simplify_tests[i].result_type, "Unexpected result type %u.\n", moniker_type);
hr = IMoniker_GetDisplayName(composite, bindctx, NULL, &name);
ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
ok(!lstrcmpW(name, simplify_tests[i].name), "Unexpected result name %s.\n", wine_dbgstr_w(name));
CoTaskMemFree(name);
IMoniker_Release(composite);
}
else
ok(simplify_tests[i].result_type == MKSYS_NONE, "Unexpected result type.\n");
winetest_pop_context();
IMoniker_Release(left);
IMoniker_Release(right);
}
hr = CreateItemMoniker(L"!", L"Test", &moniker1);
ok(hr == S_OK, "Failed to create a moniker, hr %#x.\n", hr);
hr = CreateItemMoniker(L"#", L"Wine", &moniker2);
@ -2928,71 +3015,9 @@ static void test_generic_composite_moniker(void)
hr = CreateGenericComposite(moniker1, moniker2, &moniker);
ok(hr == S_OK, "Failed to create a moniker, hr %#x.\n", hr);
/* Compose with itself. */
EXPECT_REF(moniker1, 2);
hr = CreateGenericComposite(moniker1, moniker1, &moniker);
hr = CreateGenericComposite(moniker1, moniker2, &moniker);
ok(hr == S_OK, "Failed to create composite, hr %#x.\n", hr);
EXPECT_REF(moniker1, 4);
TEST_MONIKER_TYPE(moniker, MKSYS_GENERICCOMPOSITE);
IMoniker_Release(moniker);
/* (I) + (A) -> () */
hr = IMoniker_Inverse(moniker1, &inverse);
ok(hr == S_OK, "Failed to invert, hr %#x.\n", hr);
hr = CreateGenericComposite(moniker1, inverse, &moniker);
ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
ok(!moniker, "Unexpected pointer.\n");
/* (I1,I2) + (A,A) -> (I1,I2+A,A) -> (I1,A) -> () */
hr = CreateGenericComposite(moniker1, moniker2, &moniker);
ok(hr == S_OK, "Failed to create composite, hr %#x.\n", hr);
hr = CreateGenericComposite(inverse, inverse, &moniker3);
ok(hr == S_OK, "Failed to create composite, hr %#x.\n", hr);
TEST_MONIKER_TYPE(moniker3, MKSYS_GENERICCOMPOSITE);
hr = CreateGenericComposite(moniker, moniker3, &moniker4);
ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
ok(!moniker4, "Unexpected pointer.\n");
IMoniker_Release(moniker);
IMoniker_Release(moniker3);
/* (I1,I2) + (A2,A) -> (I1,I2+A2,A) -> (I1,A,A) -> (I1+A,A) -> (A) */
hr = CreateGenericComposite(moniker1, moniker2, &moniker);
ok(hr == S_OK, "Failed to create composite, hr %#x.\n", hr);
ok(!!moniker, "Unexpected pointer.\n");
inverse2 = create_antimoniker(2);
hr = CreateGenericComposite(inverse2, inverse, &moniker3);
ok(hr == S_OK, "Failed to create composite, hr %#x.\n", hr);
ok(!!moniker3, "Unexpected pointer.\n");
IMoniker_Release(inverse2);
hr = CreateGenericComposite(moniker, moniker3, &moniker4);
ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
TEST_MONIKER_TYPE(moniker4, MKSYS_ANTIMONIKER);
IMoniker_Release(moniker4);
IMoniker_Release(moniker);
IMoniker_Release(moniker3);
/* (I1,I2) + (A,I2) -> (I1,I2+A,I2) -> (I1,I2) */
hr = CreateGenericComposite(moniker1, moniker2, &moniker);
ok(hr == S_OK, "Failed to create composite, hr %#x.\n", hr);
ok(!!moniker, "Unexpected pointer.\n");
hr = CreateGenericComposite(inverse, moniker2, &moniker3);
ok(hr == S_OK, "Failed to create composite, hr %#x.\n", hr);
ok(!!moniker3, "Unexpected pointer.\n");
hr = CreateGenericComposite(moniker, moniker3, &moniker4);
ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
TEST_MONIKER_TYPE(moniker4, MKSYS_GENERICCOMPOSITE);
TEST_DISPLAY_NAME(moniker4, L"!Test#Wine");
IMoniker_Release(moniker4);
IMoniker_Release(moniker3);
IMoniker_Release(inverse);
/* Generic composite is special, as it does not addref in this case. */
hr = IMoniker_QueryInterface(moniker, &CLSID_CompositeMoniker, (void **)&unknown);