Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com --- dlls/vbscript/tests/vbscript.c | 158 +++++++++++++++++++++++++++++++++ 1 file changed, 158 insertions(+)
diff --git a/dlls/vbscript/tests/vbscript.c b/dlls/vbscript/tests/vbscript.c index f0b75ad..5b35ca8 100644 --- a/dlls/vbscript/tests/vbscript.c +++ b/dlls/vbscript/tests/vbscript.c @@ -51,6 +51,7 @@ #endif
DEFINE_GUID(GUID_NULL,0,0,0,0,0,0,0,0,0,0,0); +DEFINE_GUID(IID_IScriptTypeLib, 0xc59c6b11, 0xf6c1, 0x11cf, 0x88,0x35, 0x00,0xa0,0xc9,0x11,0xe8,0xb2); DEFINE_GUID(IID_IScriptTypeInfo, 0xc59c6b12, 0xf6c1, 0x11cf, 0x88,0x35, 0x00,0xa0,0xc9,0x11,0xe8,0xb2);
#define DEFINE_EXPECT(func) \ @@ -892,13 +893,18 @@ static void test_script_typeinfo(void) IActiveScript *vbscript; FUNCDESC *funcdesc; VARDESC *vardesc; + ITypeLib *typelib; + TLIBATTR *libattr; DESCKIND desckind; + TYPEKIND typekind; INT implTypeFlags; UINT count, index; HREFTYPE reftype; BINDPTR bindptr; MEMBERID memid; TYPEATTR *attr; + USHORT found; + BOOL boolean; HRESULT hr; WCHAR str[64], *names = str; BSTR bstr, bstrs[5]; @@ -1254,6 +1260,158 @@ static void test_script_typeinfo(void)
ITypeComp_Release(typecomp);
+ /* Check the TypeLib */ + hr = IDispatchEx_QueryInterface(script_disp, &IID_ITypeLib, (void**)&typelib); + ok(hr == E_NOINTERFACE, "QueryInterface(IID_ITypeLib) returned: %08x\n", hr); + hr = ITypeInfo_GetContainingTypeLib(typeinfo, NULL, &index); + ok(hr == S_OK, "GetContainingTypeLib failed: %08x\n", hr); + ok(index == 0, "Unexpected index %u\n", index); + hr = ITypeInfo_GetContainingTypeLib(typeinfo, &typelib, NULL); + ok(hr == S_OK, "GetContainingTypeLib failed: %08x\n", hr); + + hr = ITypeLib_GetDocumentation(typelib, 1337, NULL, NULL, NULL, NULL); + ok(hr == TYPE_E_ELEMENTNOTFOUND, "GetDocumentation(1337) returned: %08x\n", hr); + hr = ITypeLib_GetDocumentation(typelib, -1, &bstr, NULL, NULL, NULL); + ok(hr == S_OK, "GetDocumentation(-1) failed: %08x\n", hr); + ok(!lstrcmpW(bstr, L"VBScriptTypeLib"), "Unexpected TypeLib name %s\n", wine_dbgstr_w(bstr)); + SysFreeString(bstr); + hr = ITypeLib_GetDocumentation(typelib, 0, &bstr, NULL, NULL, NULL); + ok(hr == S_OK, "GetDocumentation(0) failed: %08x\n", hr); + ok(!lstrcmpW(bstr, L"VBScriptTypeInfo"), "Unexpected TypeInfo name %s\n", wine_dbgstr_w(bstr)); + SysFreeString(bstr); + + hr = ITypeLib_GetLibAttr(typelib, NULL); + ok(hr == E_INVALIDARG, "GetLibAttr returned: %08x\n", hr); + hr = ITypeLib_GetLibAttr(typelib, &libattr); + ok(hr == S_OK, "GetLibAttr failed: %08x\n", hr); + ok(IsEqualGUID(&libattr->guid, &IID_IScriptTypeLib), "Unexpected GUID %s\n", wine_dbgstr_guid(&libattr->guid)); + ok(libattr->lcid == LOCALE_USER_DEFAULT, "Unexpected LCID %u\n", libattr->lcid); + ok(libattr->syskind == SYS_WIN32, "Unexpected syskind %u\n", libattr->syskind); + ok(libattr->wLibFlags == 0, "Unexpected wLibFlags 0x%x\n", libattr->wLibFlags); + ITypeLib_ReleaseTLibAttr(typelib, libattr); + + hr = ITypeLib_GetTypeInfoType(typelib, index, NULL); + ok(hr == E_INVALIDARG, "GetTypeInfoType returned: %08x\n", hr); + hr = ITypeLib_GetTypeInfoType(typelib, 1337, &typekind); + ok(hr == TYPE_E_ELEMENTNOTFOUND, "GetTypeInfoType returned: %08x\n", hr); + hr = ITypeLib_GetTypeInfoType(typelib, index, &typekind); + ok(hr == S_OK, "GetTypeInfoType failed: %08x\n", hr); + ok(typekind == TKIND_DISPATCH, "Unexpected typekind %u\n", typekind); + + count = ITypeLib_GetTypeInfoCount(typelib); + ok(count == 1, "Unexpected TypeInfo count %u\n", count); + + ITypeLib_GetTypeInfoOfGuid(typelib, &IID_IScriptTypeInfo, NULL); + ok(hr == S_OK, "GetTypeInfoOfGuid failed: %08x\n", hr); + typeinfo2 = (ITypeInfo*)0xdeadbeef; + ITypeLib_GetTypeInfoOfGuid(typelib, &GUID_NULL, &typeinfo2); + ok(hr == S_OK, "GetTypeInfoOfGuid returned: %08x\n", hr); + ok(!typeinfo2, "Unexpected TypeInfo %p\n", typeinfo2); + ITypeLib_GetTypeInfoOfGuid(typelib, &IID_IScriptTypeInfo, &typeinfo2); + ok(hr == S_OK, "GetTypeInfoOfGuid failed: %08x\n", hr); + ok(typeinfo == typeinfo2, "Unexpected TypeInfo %p (expected %p)\n", typeinfo2, typeinfo); + ITypeInfo_Release(typeinfo2); + + hr = ITypeLib_GetTypeInfo(typelib, index, NULL); + ok(hr == E_INVALIDARG, "GetTypeInfo returned: %08x\n", hr); + hr = ITypeLib_GetTypeInfo(typelib, 1337, &typeinfo2); + ok(hr == TYPE_E_ELEMENTNOTFOUND, "GetTypeInfo returned: %08x\n", hr); + hr = ITypeLib_GetTypeInfo(typelib, index, &typeinfo2); + ok(hr == S_OK, "GetTypeInfo failed: %08x\n", hr); + ok(typeinfo == typeinfo2, "Unexpected TypeInfo %p (expected %p)\n", typeinfo2, typeinfo); + ITypeInfo_Release(typeinfo2); + + found = 1; + wcscpy(str, L"not_found"); + hr = ITypeLib_FindName(typelib, NULL, 0, &typeinfo2, &memid, &found); + ok(hr == E_INVALIDARG, "FindName(not_found, null name) returned: %08x\n", hr); + hr = ITypeLib_FindName(typelib, str, 0, NULL, &memid, &found); + ok(hr == E_INVALIDARG, "FindName(not_found, null param) returned: %08x\n", hr); + hr = ITypeLib_FindName(typelib, str, 0, &typeinfo2, NULL, &found); + ok(hr == E_INVALIDARG, "FindName(not_found, null param) returned: %08x\n", hr); + hr = ITypeLib_FindName(typelib, str, 0, &typeinfo2, &memid, NULL); + ok(hr == E_INVALIDARG, "FindName(not_found, null param) returned: %08x\n", hr); + found = 1; + hr = ITypeLib_FindName(typelib, str, 0, &typeinfo2, &memid, &found); + ok(hr == S_OK, "FindName(not_found) failed: %08x\n", hr); + ok(found == 0, "Unexpected found %u\n", found); + hr = ITypeLib_IsName(typelib, NULL, 0, &boolean); + ok(hr == E_INVALIDARG, "IsName(not_found, null name) returned: %08x\n", hr); + hr = ITypeLib_IsName(typelib, str, 0, NULL); + ok(hr == E_INVALIDARG, "IsName(not_found, null out) returned: %08x\n", hr); + hr = ITypeLib_IsName(typelib, str, 0, &boolean); + ok(hr == S_OK, "IsName(not_found) failed: %08x\n", hr); + ok(boolean == FALSE, "Unexpected IsName BOOL return %d\n", boolean); + found = 1; + wcscpy(str, L"Global_VAR"); + hr = ITypeLib_FindName(typelib, str, 0, &typeinfo2, &memid, &found); + ok(hr == S_OK, "FindName(Global_VAR) failed: %08x\n", hr); + ok(found == 1, "Unexpected found %u\n", found); + ok(memid != MEMBERID_NIL, "Unexpected MEMBERID_NIL memid\n"); + ok(typeinfo == typeinfo2, "Unexpected TypeInfo %p (expected %p)\n", typeinfo2, typeinfo); + ok(!lstrcmpW(str, var[0].name), "Unexpected string %s\n", wine_dbgstr_w(str)); + ITypeInfo_Release(typeinfo2); + wcscpy(str, L"gloBAL_vaR"); + hr = ITypeLib_IsName(typelib, str, 0, &boolean); + ok(hr == S_OK, "IsName(gloBAL_vaR) failed: %08x\n", hr); + ok(boolean == TRUE, "Unexpected IsName BOOL return %d\n", boolean); + ok(!lstrcmpW(str, var[0].name), "Unexpected string %s\n", wine_dbgstr_w(str)); + found = 1; + wcscpy(str, L"IDispatch"); + hr = ITypeLib_FindName(typelib, str, 0, &typeinfo2, &memid, &found); + ok(hr == S_OK, "FindName(IDispatch) failed: %08x\n", hr); + ok(found == 0, "Unexpected found %u\n", found); + wcscpy(str, L"Invoke"); + hr = ITypeLib_IsName(typelib, str, 0, &boolean); + ok(hr == S_OK, "IsName(Invoke) failed: %08x\n", hr); + ok(boolean == FALSE, "Unexpected IsName BOOL return %d\n", boolean); + + hr = ITypeLib_QueryInterface(typelib, &IID_ITypeComp, (void**)&typecomp); + ok(hr == S_OK, "QueryInterface(IID_ITypeComp) failed: %08x\n", hr); + hr = ITypeLib_GetTypeComp(typelib, NULL); + ok(hr == E_INVALIDARG, "GetTypeComp returned: %08x\n", hr); + hr = ITypeLib_GetTypeComp(typelib, &typecomp2); + ok(hr == S_OK, "GetTypeComp failed: %08x\n", hr); + ok(typecomp == typecomp2, "QueryInterface(IID_ITypeComp) and GetTypeComp returned different TypeComps\n"); + ITypeComp_Release(typecomp2); + + wcscpy(str, var[0].name); + hr = ITypeComp_Bind(typecomp, NULL, 0, 0, &typeinfo2, &desckind, &bindptr); + ok(hr == E_INVALIDARG, "Bind returned: %08x\n", hr); + hr = ITypeComp_Bind(typecomp, str, 0, 0, NULL, &desckind, &bindptr); + ok(hr == E_INVALIDARG, "Bind returned: %08x\n", hr); + hr = ITypeComp_Bind(typecomp, str, 0, 0, &typeinfo2, NULL, &bindptr); + ok(hr == E_INVALIDARG, "Bind returned: %08x\n", hr); + hr = ITypeComp_Bind(typecomp, str, 0, 0, &typeinfo2, &desckind, NULL); + ok(hr == E_INVALIDARG, "Bind returned: %08x\n", hr); + hr = ITypeComp_Bind(typecomp, str, 0, 0, &typeinfo2, &desckind, &bindptr); + ok(hr == S_OK, "Bind failed: %08x\n", hr); + ok(desckind == DESCKIND_NONE, "Unexpected desckind %u\n", desckind); + wcscpy(str, L"vbscriptTypeInfo"); + hr = ITypeComp_Bind(typecomp, str, 0, 0, &typeinfo2, &desckind, &bindptr); + ok(hr == S_OK, "Bind failed: %08x\n", hr); + ok(desckind == DESCKIND_NONE, "Unexpected desckind %u\n", desckind); + hr = ITypeComp_BindType(typecomp, NULL, 0, &typeinfo2, &typecomp2); + ok(hr == E_INVALIDARG, "BindType returned: %08x\n", hr); + hr = ITypeComp_BindType(typecomp, str, 0, NULL, &typecomp2); + ok(hr == E_INVALIDARG, "BindType returned: %08x\n", hr); + hr = ITypeComp_BindType(typecomp, str, 0, &typeinfo2, NULL); + ok(hr == E_INVALIDARG, "BindType returned: %08x\n", hr); + hr = ITypeComp_BindType(typecomp, str, 0, &typeinfo2, &typecomp2); + ok(hr == S_OK, "BindType failed: %08x\n", hr); + ok(typeinfo == typeinfo2, "Unexpected TypeInfo %p (expected %p)\n", typeinfo2, typeinfo); + ok(!typecomp2, "Unexpected TypeComp %p (expected null)\n", typecomp2); + ok(!lstrcmpW(str, L"vbscriptTypeInfo"), "Unexpected string %s\n", wine_dbgstr_w(str)); + ITypeInfo_Release(typeinfo2); + wcscpy(str, L"IDispatch"); + hr = ITypeComp_BindType(typecomp, str, 0, &typeinfo2, &typecomp2); + ok(hr == S_OK, "BindType failed: %08x\n", hr); + ok(!typeinfo2, "Unexpected TypeInfo %p (expected null)\n", typeinfo2); + ok(!typecomp2, "Unexpected TypeComp %p (expected null)\n", typecomp2); + + ITypeComp_Release(typecomp); + ITypeLib_Release(typelib); + /* Updating the script won't update the typeinfo obtained before, but it will be reflected in any typeinfo obtained afterwards. */ parse_script(parser,