oleaut32/tests: Update the typelib test generator to match existing data.

Signed-off-by: Dmitry Timoshkov <dmitry@baikal.ru>
This commit is contained in:
Dmitry Timoshkov 2015-10-05 20:36:13 +08:00 committed by Alexandre Julliard
parent ed0c9ba694
commit 016985f67d
1 changed files with 118 additions and 34 deletions

View File

@ -28,6 +28,7 @@
#include <wine/test.h>
#include <stdarg.h>
#include <stdio.h>
#include <assert.h>
#include "windef.h"
#include "winbase.h"
@ -44,7 +45,7 @@
#define expect_int(expr, value) expect_eq(expr, (int)(value), int, "%d")
#define expect_hex(expr, value) expect_eq(expr, (int)(value), int, "0x%x")
#define expect_null(expr) expect_eq(expr, NULL, const void *, "%p")
#define expect_guid(expected, guid) { ok(IsEqualGUID(expected, guid), "got wrong guid\n"); }
#define expect_guid(expected, guid) { ok(IsEqualGUID(expected, guid), "got wrong guid %s\n", wine_dbgstr_guid(guid)); }
#define expect_wstr_acpval(expr, value) \
{ \
@ -3665,11 +3666,9 @@ static void test_CreateTypeLib(SYSKIND sys) {
static char *dump_string(LPWSTR wstr)
{
int size = lstrlenW(wstr)+3;
int size = lstrlenW(wstr)+1;
char *out = CoTaskMemAlloc(size);
WideCharToMultiByte(20127, 0, wstr, -1, out+1, size, NULL, NULL);
out[0] = '\"';
strcat(out, "\"");
WideCharToMultiByte(20127, 0, wstr, -1, out, size, NULL, NULL);
return out;
}
@ -3710,6 +3709,19 @@ static const struct map_entry invkind_map[] = {
{0, NULL}
};
static const struct map_entry callconv_map[] = {
MAP_ENTRY(CC_FASTCALL),
MAP_ENTRY(CC_CDECL),
MAP_ENTRY(CC_PASCAL),
MAP_ENTRY(CC_MACPASCAL),
MAP_ENTRY(CC_STDCALL),
MAP_ENTRY(CC_FPFASTCALL),
MAP_ENTRY(CC_SYSCALL),
MAP_ENTRY(CC_MPWCDECL),
MAP_ENTRY(CC_MPWPASCAL),
{0, NULL}
};
#undef MAP_ENTRY
static const char *map_value(DWORD val, const struct map_entry *map)
@ -3730,6 +3742,66 @@ static const char *map_value(DWORD val, const struct map_entry *map)
return buf;
}
static const char *dump_type_flags(DWORD flags)
{
static char buf[256];
if (!flags) return "0";
buf[0] = 0;
#define ADD_FLAG(x) if (flags & x) { if (buf[0]) strcat(buf, "|"); strcat(buf, #x); flags &= ~x; }
ADD_FLAG(TYPEFLAG_FPROXY)
ADD_FLAG(TYPEFLAG_FREVERSEBIND)
ADD_FLAG(TYPEFLAG_FDISPATCHABLE)
ADD_FLAG(TYPEFLAG_FREPLACEABLE)
ADD_FLAG(TYPEFLAG_FAGGREGATABLE)
ADD_FLAG(TYPEFLAG_FRESTRICTED)
ADD_FLAG(TYPEFLAG_FOLEAUTOMATION)
ADD_FLAG(TYPEFLAG_FNONEXTENSIBLE)
ADD_FLAG(TYPEFLAG_FDUAL)
ADD_FLAG(TYPEFLAG_FCONTROL)
ADD_FLAG(TYPEFLAG_FHIDDEN)
ADD_FLAG(TYPEFLAG_FPREDECLID)
ADD_FLAG(TYPEFLAG_FLICENSED)
ADD_FLAG(TYPEFLAG_FCANCREATE)
ADD_FLAG(TYPEFLAG_FAPPOBJECT)
#undef ADD_FLAG
assert(!flags);
assert(strlen(buf) < sizeof(buf));
return buf;
}
static char *print_size(BSTR name, TYPEATTR *attr)
{
static char buf[256];
switch (attr->typekind)
{
case TKIND_DISPATCH:
case TKIND_INTERFACE:
sprintf(buf, "sizeof(%s*)", dump_string(name));
break;
case TKIND_RECORD:
sprintf(buf, "sizeof(struct %s)", dump_string(name));
break;
case TKIND_ENUM:
case TKIND_ALIAS:
sprintf(buf, "4");
break;
default:
assert(0);
return NULL;
}
return buf;
}
static void test_dump_typelib(const char *name)
{
WCHAR wszString[260];
@ -3740,8 +3812,10 @@ static void test_dump_typelib(const char *name)
MultiByteToWideChar(CP_ACP, 0, name, -1, wszString, 260);
OLE_CHECK(LoadTypeLib(wszString, &lib));
printf("/*** Autogenerated data. Do not edit, change the generator above instead. ***/\n");
count = ITypeLib_GetTypeInfoCount(lib);
printf("/* interfaces count: %d */\n", count);
for (i = 0; i < count; i++)
{
TYPEATTR *attr;
@ -3750,17 +3824,22 @@ static void test_dump_typelib(const char *name)
OLE_CHECK(ITypeLib_GetDocumentation(lib, i, &name, NULL, NULL, NULL));
printf("{\n"
" %s,\n", dump_string(name));
SysFreeString(name);
" \"%s\",\n", dump_string(name));
OLE_CHECK(ITypeLib_GetTypeInfo(lib, i, &info));
ITypeInfo_GetTypeAttr(info, &attr);
printf(" /*kind*/ %s, /*flags*/ 0x%x, /*align*/ %d, /*size*/ %d,\n"
" /*#vtbl*/ %d, /*#func*/ %d,\n"
" {\n",
map_value(attr->typekind, tkind_map), attr->wTypeFlags, attr->cbAlignment, attr->cbSizeInstance, attr->cbSizeVft,
OLE_CHECK(ITypeInfo_GetTypeAttr(info, &attr));
printf(" \"%s\",\n", wine_dbgstr_guid(&attr->guid));
printf(" /*kind*/ %s, /*flags*/ %s, /*align*/ %d, /*size*/ %s,\n"
" /*#vtbl*/ %d, /*#func*/ %d",
map_value(attr->typekind, tkind_map), dump_type_flags(attr->wTypeFlags),
attr->cbAlignment, print_size(name, attr), attr->cbSizeVft/sizeof(void*),
attr->cFuncs);
ITypeInfo_ReleaseTypeAttr(info, attr);
if (attr->cFuncs) printf(",\n {\n");
else printf("\n");
while (1)
{
FUNCDESC *desc;
@ -3771,11 +3850,11 @@ static void test_dump_typelib(const char *name)
if (FAILED(ITypeInfo_GetFuncDesc(info, f, &desc)))
break;
printf(" {\n"
" 0x%x, /*func*/ %s, /*inv*/ %s, /*call*/ 0x%x,\n",
" /*id*/ 0x%x, /*func*/ %s, /*inv*/ %s, /*call*/ %s,\n",
desc->memid, map_value(desc->funckind, funckind_map), map_value(desc->invkind, invkind_map),
desc->callconv);
map_value(desc->callconv, callconv_map));
printf(" /*#param*/ %d, /*#opt*/ %d, /*vtbl*/ %d, /*#scodes*/ %d, /*flags*/ 0x%x,\n",
desc->cParams, desc->cParamsOpt, desc->oVft, desc->cScodes, desc->wFuncFlags);
desc->cParams, desc->cParamsOpt, desc->oVft/sizeof(void*), desc->cScodes, desc->wFuncFlags);
printf(" {%d, %x}, /* ret */\n", desc->elemdescFunc.tdesc.vt, U(desc->elemdescFunc).paramdesc.wParamFlags);
printf(" { /* params */\n");
for (p = 0; p < desc->cParams; p++)
@ -3789,7 +3868,7 @@ static void test_dump_typelib(const char *name)
OLE_CHECK(ITypeInfo_GetNames(info, desc->memid, tab, 256, &cNames));
for (p = 0; p < cNames; p++)
{
printf(" %s,\n", dump_string(tab[p]));
printf(" \"%s\",\n", dump_string(tab[p]));
SysFreeString(tab[p]);
}
printf(" NULL,\n");
@ -3798,9 +3877,11 @@ static void test_dump_typelib(const char *name)
ITypeInfo_ReleaseFuncDesc(info, desc);
f++;
}
printf(" }\n");
if (attr->cFuncs) printf(" }\n");
printf("},\n");
ITypeInfo_ReleaseTypeAttr(info, attr);
ITypeInfo_Release(info);
SysFreeString(name);
}
ITypeLib_Release(lib);
}
@ -3843,14 +3924,15 @@ typedef struct _type_info
} type_info;
static const type_info info[] = {
/*** Autogenerated data. Do not edit, change the generator above instead. ***/
{
"IDualIface",
"{b14b6bb5-904e-4ff9-b247-bd361f7aaedd}",
/*kind*/ TKIND_DISPATCH, /*flags*/ TYPEFLAG_FDISPATCHABLE|TYPEFLAG_FDUAL, /*align*/ 4, /*size*/ sizeof(void*),
/*kind*/ TKIND_DISPATCH, /*flags*/ TYPEFLAG_FDISPATCHABLE|TYPEFLAG_FDUAL, /*align*/ 4, /*size*/ sizeof(IDualIface*),
/*#vtbl*/ 7, /*#func*/ 8,
{
{
0x60000000, /*func*/ FUNC_DISPATCH, /*inv*/ INVOKE_FUNC, /*call*/ CC_STDCALL,
/*id*/ 0x60000000, /*func*/ FUNC_DISPATCH, /*inv*/ INVOKE_FUNC, /*call*/ CC_STDCALL,
/*#param*/ 2, /*#opt*/ 0, /*vtbl*/ 0, /*#scodes*/ 0, /*flags*/ 0x1,
{24, 0}, /* ret */
{ /* params */
@ -3866,7 +3948,7 @@ static const type_info info[] = {
},
},
{
0x60000001, /*func*/ FUNC_DISPATCH, /*inv*/ INVOKE_FUNC, /*call*/ CC_STDCALL,
/*id*/ 0x60000001, /*func*/ FUNC_DISPATCH, /*inv*/ INVOKE_FUNC, /*call*/ CC_STDCALL,
/*#param*/ 0, /*#opt*/ 0, /*vtbl*/ 1, /*#scodes*/ 0, /*flags*/ 0x1,
{19, 0}, /* ret */
{ /* params */
@ -3878,7 +3960,7 @@ static const type_info info[] = {
},
},
{
0x60000002, /*func*/ FUNC_DISPATCH, /*inv*/ INVOKE_FUNC, /*call*/ CC_STDCALL,
/*id*/ 0x60000002, /*func*/ FUNC_DISPATCH, /*inv*/ INVOKE_FUNC, /*call*/ CC_STDCALL,
/*#param*/ 0, /*#opt*/ 0, /*vtbl*/ 2, /*#scodes*/ 0, /*flags*/ 0x1,
{19, 0}, /* ret */
{ /* params */
@ -3890,7 +3972,7 @@ static const type_info info[] = {
},
},
{
0x60010000, /*func*/ FUNC_DISPATCH, /*inv*/ INVOKE_FUNC, /*call*/ CC_STDCALL,
/*id*/ 0x60010000, /*func*/ FUNC_DISPATCH, /*inv*/ INVOKE_FUNC, /*call*/ CC_STDCALL,
/*#param*/ 1, /*#opt*/ 0, /*vtbl*/ 3, /*#scodes*/ 0, /*flags*/ 0x1,
{24, 0}, /* ret */
{ /* params */
@ -3904,7 +3986,7 @@ static const type_info info[] = {
},
},
{
0x60010001, /*func*/ FUNC_DISPATCH, /*inv*/ INVOKE_FUNC, /*call*/ CC_STDCALL,
/*id*/ 0x60010001, /*func*/ FUNC_DISPATCH, /*inv*/ INVOKE_FUNC, /*call*/ CC_STDCALL,
/*#param*/ 3, /*#opt*/ 0, /*vtbl*/ 4, /*#scodes*/ 0, /*flags*/ 0x1,
{24, 0}, /* ret */
{ /* params */
@ -3922,7 +4004,7 @@ static const type_info info[] = {
},
},
{
0x60010002, /*func*/ FUNC_DISPATCH, /*inv*/ INVOKE_FUNC, /*call*/ CC_STDCALL,
/*id*/ 0x60010002, /*func*/ FUNC_DISPATCH, /*inv*/ INVOKE_FUNC, /*call*/ CC_STDCALL,
/*#param*/ 5, /*#opt*/ 0, /*vtbl*/ 5, /*#scodes*/ 0, /*flags*/ 0x1,
{24, 0}, /* ret */
{ /* params */
@ -3944,7 +4026,7 @@ static const type_info info[] = {
},
},
{
0x60010003, /*func*/ FUNC_DISPATCH, /*inv*/ INVOKE_FUNC, /*call*/ CC_STDCALL,
/*id*/ 0x60010003, /*func*/ FUNC_DISPATCH, /*inv*/ INVOKE_FUNC, /*call*/ CC_STDCALL,
/*#param*/ 8, /*#opt*/ 0, /*vtbl*/ 6, /*#scodes*/ 0, /*flags*/ 0x1,
{24, 0}, /* ret */
{ /* params */
@ -3972,7 +4054,7 @@ static const type_info info[] = {
},
},
{
0x60020000, /*func*/ FUNC_DISPATCH, /*inv*/ INVOKE_FUNC, /*call*/ CC_STDCALL,
/*id*/ 0x60020000, /*func*/ FUNC_DISPATCH, /*inv*/ INVOKE_FUNC, /*call*/ CC_STDCALL,
/*#param*/ 0, /*#opt*/ 0, /*vtbl*/ 7, /*#scodes*/ 0, /*flags*/ 0x0,
{24, 0}, /* ret */
{ /* params */
@ -3988,11 +4070,11 @@ static const type_info info[] = {
{
"ISimpleIface",
"{ec5dfcd6-eeb0-4cd6-b51e-8030e1dac009}",
/*kind*/ TKIND_INTERFACE, /*flags*/ TYPEFLAG_FDISPATCHABLE, /*align*/ 4, /*size*/ sizeof(void*),
/*kind*/ TKIND_INTERFACE, /*flags*/ TYPEFLAG_FDISPATCHABLE, /*align*/ 4, /*size*/ sizeof(ISimpleIface*),
/*#vtbl*/ 8, /*#func*/ 1,
{
{
0x60020000, /*func*/ FUNC_PUREVIRTUAL, /*inv*/ INVOKE_FUNC, /*call*/ CC_STDCALL,
/*id*/ 0x60020000, /*func*/ FUNC_PUREVIRTUAL, /*inv*/ INVOKE_FUNC, /*call*/ CC_STDCALL,
/*#param*/ 0, /*#opt*/ 0, /*vtbl*/ 7, /*#scodes*/ 0, /*flags*/ 0x0,
{25, 0}, /* ret */
{ /* params */
@ -4008,12 +4090,14 @@ static const type_info info[] = {
{
"test_struct",
"{4029f190-ca4a-4611-aeb9-673983cb96dd}",
/* kind */ TKIND_RECORD, /*flags*/ 0, /*align*/ 4, /*size*/ sizeof(struct test_struct)
/*kind*/ TKIND_RECORD, /*flags*/ 0, /*align*/ 4, /*size*/ sizeof(struct test_struct),
/*#vtbl*/ 0, /*#func*/ 0
},
{
"test_struct2",
"{4029f190-ca4a-4611-aeb9-673983cb96de}",
/* kind */ TKIND_RECORD, /*flags*/ 0, /*align*/ 4, /*size*/ sizeof(struct test_struct)
/*kind*/ TKIND_RECORD, /*flags*/ 0, /*align*/ 4, /*size*/ sizeof(struct test_struct2),
/*#vtbl*/ 0, /*#func*/ 0
}
};
@ -4068,8 +4152,8 @@ static void test_dump_typelib(const char *name)
/* check that it's possible to search using this uuid */
typeinfo2 = NULL;
hr = ITypeLib_GetTypeInfoOfGuid(typelib, &guid, &typeinfo2);
ok(hr == S_OK, "got 0x%08x\n", hr);
ITypeInfo_Release(typeinfo2);
ok(hr == S_OK || (IsEqualGUID(&guid, &IID_NULL) && hr == TYPE_E_ELEMENTNOTFOUND), "got 0x%08x\n", hr);
if (hr == S_OK) ITypeInfo_Release(typeinfo2);
}
for (func = 0; func < typeattr->cFuncs; func++)