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:
parent
5c18aa58d3
commit
6bc9f83ddf
|
@ -68,15 +68,6 @@ DEFINE_OLEGUID(CLSID_CompositeMoniker, 0x309, 0, 0);
|
||||||
DEFINE_OLEGUID(CLSID_ClassMoniker, 0x31a, 0, 0);
|
DEFINE_OLEGUID(CLSID_ClassMoniker, 0x31a, 0, 0);
|
||||||
DEFINE_OLEGUID(CLSID_PointerMoniker, 0x306, 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_TODO(m,t) _test_moniker_type(m, t, TRUE, __LINE__)
|
||||||
#define TEST_MONIKER_TYPE(m,t) _test_moniker_type(m, t, FALSE, __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)
|
static void _test_moniker_type(IMoniker *moniker, DWORD type, BOOL todo, int line)
|
||||||
|
@ -2902,9 +2893,65 @@ todo_wine
|
||||||
IMoniker_Release(moniker2);
|
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)
|
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;
|
IEnumMoniker *enummoniker;
|
||||||
IRunningObjectTable *rot;
|
IRunningObjectTable *rot;
|
||||||
DWORD hash, cookie;
|
DWORD hash, cookie;
|
||||||
|
@ -2915,12 +2962,52 @@ static void test_generic_composite_moniker(void)
|
||||||
IROTData *rotdata;
|
IROTData *rotdata;
|
||||||
IMarshal *marshal;
|
IMarshal *marshal;
|
||||||
IStream *stream;
|
IStream *stream;
|
||||||
|
unsigned int i;
|
||||||
WCHAR *str;
|
WCHAR *str;
|
||||||
ULONG len;
|
ULONG len;
|
||||||
|
|
||||||
hr = CreateBindCtx(0, &bindctx);
|
hr = CreateBindCtx(0, &bindctx);
|
||||||
ok(hr == S_OK, "Failed to create bind context, hr %#x.\n", hr);
|
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);
|
hr = CreateItemMoniker(L"!", L"Test", &moniker1);
|
||||||
ok(hr == S_OK, "Failed to create a moniker, hr %#x.\n", hr);
|
ok(hr == S_OK, "Failed to create a moniker, hr %#x.\n", hr);
|
||||||
hr = CreateItemMoniker(L"#", L"Wine", &moniker2);
|
hr = CreateItemMoniker(L"#", L"Wine", &moniker2);
|
||||||
|
@ -2928,71 +3015,9 @@ static void test_generic_composite_moniker(void)
|
||||||
hr = CreateGenericComposite(moniker1, moniker2, &moniker);
|
hr = CreateGenericComposite(moniker1, moniker2, &moniker);
|
||||||
ok(hr == S_OK, "Failed to create a moniker, hr %#x.\n", hr);
|
ok(hr == S_OK, "Failed to create a moniker, hr %#x.\n", hr);
|
||||||
|
|
||||||
/* Compose with itself. */
|
hr = CreateGenericComposite(moniker1, moniker2, &moniker);
|
||||||
EXPECT_REF(moniker1, 2);
|
|
||||||
hr = CreateGenericComposite(moniker1, moniker1, &moniker);
|
|
||||||
ok(hr == S_OK, "Failed to create composite, hr %#x.\n", hr);
|
ok(hr == S_OK, "Failed to create composite, hr %#x.\n", hr);
|
||||||
EXPECT_REF(moniker1, 4);
|
|
||||||
TEST_MONIKER_TYPE(moniker, MKSYS_GENERICCOMPOSITE);
|
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. */
|
/* Generic composite is special, as it does not addref in this case. */
|
||||||
hr = IMoniker_QueryInterface(moniker, &CLSID_CompositeMoniker, (void **)&unknown);
|
hr = IMoniker_QueryInterface(moniker, &CLSID_CompositeMoniker, (void **)&unknown);
|
||||||
|
|
Loading…
Reference in New Issue