From: Vibhav Pant vibhavp@gmail.com
--- dlls/rometadata/tests/rometadata.c | 103 ++++++++++++++++++++++++++++ dlls/rometadata/tests/test-enum.idl | 16 +++++ include/corhdr.h | 26 +++++++ 3 files changed, 145 insertions(+)
diff --git a/dlls/rometadata/tests/rometadata.c b/dlls/rometadata/tests/rometadata.c index 61205a13cd5..b9cce8ca87a 100644 --- a/dlls/rometadata/tests/rometadata.c +++ b/dlls/rometadata/tests/rometadata.c @@ -801,6 +801,15 @@ struct field_props const char exp_value[2]; };
+struct property +{ + const WCHAR *exp_name; + BYTE exp_sig_blob[4]; + ULONG exp_sig_len; + BOOL has_get; + BOOL has_set; +}; + #define test_contract_value(data, data_len, exp_name, exp_version) test_contract_value_(__LINE__, data, data_len, exp_name, exp_version) static void test_contract_value_(int line, const BYTE *data, ULONG data_len, const char *exp_name, UINT32 exp_version) { @@ -823,6 +832,39 @@ static void test_contract_value_(int line, const BYTE *data, ULONG data_len, con } }
+enum prop_method_type +{ + PROP_METHOD_GET, + PROP_METHOD_SET +}; + +#define test_prop_method_token(md, class_token, name, type, token) \ + test_prop_method_token_(__LINE__, md, class_token, name, type, token) +static void test_prop_method_token_(int line, IMetaDataImport *md_import, mdTypeDef class_typedef, + const WCHAR *prop_name, enum prop_method_type type, mdMethodDef token) +{ + static const CorMethodAttr exp_attrs = mdPublic | mdNewSlot | mdVirtual | mdHideBySig | mdAbstract | mdSpecialName; + const WCHAR *prefix = type == PROP_METHOD_GET ? L"get" : L"put"; + WCHAR exp_name[80], name[80]; + ULONG attrs = 0, impl = 0; + mdTypeDef type_def = 0; + HRESULT hr; + BOOL valid; + + ok_(__FILE__, line)(token && token != mdMethodDefNil, "got token %#x\n", token); + valid = IMetaDataImport_IsValidToken(md_import, token); + ok_(__FILE__, line)(valid, "got value %d\n", valid); + name[0] = L'\0'; + hr = IMetaDataImport_GetMethodProps(md_import, token, &type_def, name, ARRAY_SIZE(name), NULL, &attrs, NULL, NULL, + NULL, &impl); + todo_wine ok_(__FILE__, line)(hr == S_OK, "GetMethodProps failed, got hr %#lx\n", hr); + swprintf(exp_name, ARRAY_SIZE(exp_name), L"%s_%s", prefix, prop_name); + todo_wine ok_(__FILE__, line)(!wcscmp(name, exp_name), "got name %s != %s\n", debugstr_w(name), + debugstr_w(exp_name)); + todo_wine ok_(__FILE__, line)(attrs == exp_attrs, "got attrs %#lx != %#x\n", attrs, exp_attrs); + todo_wine ok_(__FILE__, line)(!impl, "got impl %#lx\n", impl); +} + static void test_IMetaDataImport(void) { static const struct type_info type_defs[] = @@ -831,6 +873,7 @@ static void test_IMetaDataImport(void) { tdPublic | tdSealed | tdSequentialLayout | tdWindowsRuntime, "TestStruct1", "Wine.Test", 0x1000005, "Windows.Foundation.UniversalApiContract", 0x20000 }, { tdInterface | tdAbstract | tdWindowsRuntime, "ITest2", "Wine.Test", 0x1000000, "Windows.Foundation.UniversalApiContract", 0x30000 }, { tdPublic | tdSealed | tdWindowsRuntime, "Test2", "Wine.Test", 0x100000b, "Windows.Foundation.UniversalApiContract", 0x30000 }, + { tdPublic | tdInterface | tdAbstract | tdWindowsRuntime, "ITest3", "Wine.Test", 0x1000000, "Windows.Foundation.UniversalApiContract", 0x10000 }, }; static const struct method_props test2_methods[2] = { @@ -850,6 +893,14 @@ static void test_IMetaDataImport(void) { L"b", fdPublic, ELEMENT_TYPE_VOID, { 0x6, ELEMENT_TYPE_I4 }, 2 }, { L"c", fdPublic, ELEMENT_TYPE_VOID, { 0x6, ELEMENT_TYPE_I4 }, 2 }, }; + static const struct property test3_props[5] = + { + { L"Prop1", { 0x28, 0x0, 0x8 }, 3, TRUE, FALSE}, + { L"Prop2", { 0x28, 0x0, 0x11, 0x9 }, 4, TRUE, FALSE }, + { L"Prop3", { 0x28, 0, 0x11, 0x19 }, 4, TRUE, FALSE }, + { L"Prop4", { 0x28, 0, 0x1c }, 3, TRUE, FALSE }, + { L"Prop5", { 0x28, 0x0, 0x8 }, 3, TRUE, TRUE}, + }; const struct field_enum_test_case { const WCHAR *type_name; @@ -868,6 +919,7 @@ static void test_IMetaDataImport(void) mdMethodDef *methoddef_tokens; IMetaDataDispenser *dispenser; mdFieldDef *fielddef_tokens; + mdProperty *property_tokens; IMetaDataImport *md_import; const BYTE *data = NULL; HCORENUM henum = 0; @@ -1107,6 +1159,57 @@ static void test_IMetaDataImport(void) ok(IsEqualGUID(guid, &IID_ITest2), "got guid %s\n", debugstr_guid(guid)); }
+ typedef1 = buf_len = 0; + hr = IMetaDataImport_FindTypeDefByName(md_import, L"Wine.Test.ITest3", 0, &typedef1); + todo_wine ok(hr == S_OK, "got hr %#lx\n", hr); + henum = NULL; + hr = IMetaDataImport_EnumProperties(md_import, &henum, typedef1, NULL, 0, NULL); + todo_wine ok(hr == S_FALSE, "got hr %#lx\n", hr); + hr = IMetaDataImport_CountEnum(md_import, henum, &buf_len); + todo_wine ok(hr == S_OK, "got hr %#lx\n", hr); + todo_wine ok(buf_len == ARRAY_SIZE(test3_props), "got buf_len %lu\n", buf_len); + property_tokens = calloc(buf_len, sizeof(*property_tokens)); + ok(!!property_tokens, "got property_tokens %p\n", property_tokens); + buf_count = 0xdeadbeef; + hr = IMetaDataImport_EnumProperties(md_import, &henum, typedef1, property_tokens, buf_len, &buf_count); + todo_wine ok(hr == S_OK, "got hr %#lx\n", hr); + todo_wine ok(buf_count == buf_len, "got buf_count %lu != %lu\n", buf_count, buf_len); + IMetaDataImport_CloseEnum(md_import, henum); + for (i = 0; i < buf_len; i++) + { + ULONG sig_len = 0, value_type = 0, value_len = 0; + const struct property *props = &test3_props[i]; + mdMethodDef get_method = 0, set_method = 0; + const COR_SIGNATURE *sig_blob = NULL; + UVCP_CONSTANT value = NULL; + WCHAR name[80]; + + winetest_push_context("i=%lu", i); + + name[0] = L'\0'; + str_reqd = 0; + hr = IMetaDataImport_GetPropertyProps(md_import, property_tokens[i], &typedef2, name, ARRAY_SIZE(name), + &str_reqd, &val, &sig_blob, &sig_len, &value_type, &value, &value_len, + &set_method, &get_method, NULL, 0, NULL); + todo_wine ok(hr == S_OK, "got hr %#lx\n", hr); + todo_wine ok(typedef1 == typedef2, "got typedef1 %#x != %#x\n", typedef1, typedef2); + todo_wine ok(!wcscmp(name, props->exp_name), "got name %s != %s\n", debugstr_w(name), debugstr_w(props->exp_name)); + todo_wine ok(!!sig_blob, "got sig_blob %p\n", sig_blob); + todo_wine ok(sig_len == props->exp_sig_len, "got sig_len %lu != %lu\n", sig_len, props->exp_sig_len); + if (sig_blob && sig_len == props->exp_sig_len) + ok(!memcmp(sig_blob, props->exp_sig_blob, sig_len), "got unexpected sig_blob\n"); + ok(!value_len, "got value_len %lu\n", value_len); + ok(!value, "got value %p\n", value); + if (props->has_get) + test_prop_method_token(md_import, typedef1, props->exp_name, PROP_METHOD_GET, get_method); + else + todo_wine ok(get_method == mdMethodDefNil, "got get_method %#x\n", get_method); + if (props->has_set) + test_prop_method_token(md_import, typedef1, props->exp_name, PROP_METHOD_SET, set_method); + else + todo_wine ok(set_method == mdMethodDefNil, "got set_method %#x\n", set_method); + winetest_pop_context(); + } IMetaDataImport_Release(md_import); }
diff --git a/dlls/rometadata/tests/test-enum.idl b/dlls/rometadata/tests/test-enum.idl index 09c0a08a846..386ca917105 100644 --- a/dlls/rometadata/tests/test-enum.idl +++ b/dlls/rometadata/tests/test-enum.idl @@ -29,6 +29,7 @@ namespace Wine.Test { typedef enum TestEnum1 TestEnum1;
interface ITest2; + interface ITest3;
runtimeclass Test2;
@@ -69,4 +70,19 @@ namespace Wine.Test { { [default] interface Wine.Test.ITest2; } + + [ + contract(Windows.Foundation.UniversalApiContract, 1.0), + uuid(deadbeef-dead-beef-dead-deadbeef0003) + ] + interface ITest3 : IInspectable + { + HRESULT GetTest2([in] TestEnum1 a, [out, retval] Wine.Test.ITest2 **out); + [propget] HRESULT Prop1([out, retval] int *out); + [propget] HRESULT Prop2([out, retval] TestEnum1 *out); + [propget] HRESULT Prop3([out, retval] TestStruct1 *out); + [propget] HRESULT Prop4([out, retval] Wine.Test.ITest2 **out); + [propget] HRESULT Prop5([out, retval] int *a); + [propput] HRESULT Prop5([in] int a); + } } diff --git a/include/corhdr.h b/include/corhdr.h index 6650e84e23e..afa2d1e14e0 100644 --- a/include/corhdr.h +++ b/include/corhdr.h @@ -129,6 +129,32 @@ typedef mdToken mdGenericParamConstraint; typedef mdToken mdString; typedef mdToken mdCPToken;
+#define mdTokenNil ((mdToken)0) +#define mdModuleNil ((mdModule)mdtModule) +#define mdTypeRefNil ((mdTypeRef)mdtTypeRef) +#define mdTypeDefNil ((mdTypeDef)mdtTypeDef) +#define mdFieldDefNil ((mdFieldDef)mdtFieldDef) +#define mdMethodDefNil ((mdMethodDef)mdtMethodDef) +#define mdParamDefNil ((mdParamDef)mdtParamDef) +#define mdInterfaceImplNil ((mdInterfaceImpl)mdtInterfaceImpl) +#define mdMemberRefNil ((mdMemberRef)mdtMemberRef) +#define mdCustomAttributeNil ((mdCustomAttribute)mdtCustomAttribute) +#define mdPermissionNil ((mdPermission)mdtPermission) +#define mdSignatureNil ((mdSignature)mdtSignature) +#define mdEventNil ((mdEvent)mdtEvent) +#define mdPropertyNil ((mdProperty)mdtProperty) +#define mdModuleRefNil ((mdModuleRef)mdtModuleRef) +#define mdTypeSpecNil ((mdTypeSpec)mdtTypeSpec) +#define mdAssemblyNil ((mdAssembly)mdtAssembly) +#define mdAssemblyRefNil ((mdAssemblyRef)mdtAssemblyRef) +#define mdFileNil ((mdFile)mdtFile) +#define mdExportedTypeNil ((mdExportedType)mdtExportedType) +#define mdManifestResourceNil ((mdManifestResource)mdtManifestResource) +#define mdGenericParamNil ((mdGenericParam)mdtGenericParam) +#define mdGenericParamConstraintNil ((mdGenericParamConstraint)mdtGenericParamConstraint) +#define mdMethodSpecNil ((mdMethodSpec)mdtMethodSpec) +#define mdStringNil ((mdString)mdtString) + typedef enum CorTypeAttr { tdNotPublic = 0x000000,