From dcfa6bd484754ab87db242c25efd1161c898bc23 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Wed, 23 Apr 2014 18:06:48 +0000 Subject: [PATCH] [VBSCRIPT_WINETEST] * Sync with Wine 1.7.17. CORE-8080 svn path=/trunk/; revision=62932 --- rostests/winetests/vbscript/CMakeLists.txt | 1 + rostests/winetests/vbscript/createobj.c | 40 +-- rostests/winetests/vbscript/error.vbs | 374 +++++++++++++++++++++ rostests/winetests/vbscript/lang.vbs | 176 +++++++++- rostests/winetests/vbscript/regexp.vbs | 6 + rostests/winetests/vbscript/rsrc.rc | 3 + rostests/winetests/vbscript/run.c | 127 ++++++- 7 files changed, 684 insertions(+), 43 deletions(-) create mode 100644 rostests/winetests/vbscript/error.vbs diff --git a/rostests/winetests/vbscript/CMakeLists.txt b/rostests/winetests/vbscript/CMakeLists.txt index 0718ab7b0ec..8db064b698a 100644 --- a/rostests/winetests/vbscript/CMakeLists.txt +++ b/rostests/winetests/vbscript/CMakeLists.txt @@ -10,6 +10,7 @@ list(APPEND SOURCE list(APPEND vbscript_winetest_rc_deps ${CMAKE_CURRENT_SOURCE_DIR}/api.vbs + ${CMAKE_CURRENT_SOURCE_DIR}/error.vbs ${CMAKE_CURRENT_SOURCE_DIR}/lang.vbs ${CMAKE_CURRENT_SOURCE_DIR}/regexp.vbs) diff --git a/rostests/winetests/vbscript/createobj.c b/rostests/winetests/vbscript/createobj.c index bdb9cd69a7c..71829600b8f 100644 --- a/rostests/winetests/vbscript/createobj.c +++ b/rostests/winetests/vbscript/createobj.c @@ -125,18 +125,6 @@ const GUID GUID_CUSTOM_CONFIRMOBJECTSAFETY = #define VB_E_CANNOT_CREATE_OBJ 0x800a01ad -static const char *debugstr_guid(REFIID riid) -{ - static char buf[50]; - - sprintf(buf, "{%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}", - riid->Data1, riid->Data2, riid->Data3, riid->Data4[0], - riid->Data4[1], riid->Data4[2], riid->Data4[3], riid->Data4[4], - riid->Data4[5], riid->Data4[6], riid->Data4[7]); - - return buf; -} - static BSTR a2bstr(const char *str) { BSTR ret; @@ -444,7 +432,7 @@ static HRESULT WINAPI ClassFactory_CreateInstance(IClassFactory *iface, IUnknown CHECK_EXPECT(CreateInstance); ok(!outer, "outer = %p\n", outer); - ok(IsEqualGUID(&IID_IUnknown, riid), "unexpected riid %s\n", debugstr_guid(riid)); + ok(IsEqualGUID(&IID_IUnknown, riid), "unexpected riid %s\n", wine_dbgstr_guid(riid)); if(SUCCEEDED(CreateInstance_hres)) *ppv = &testObj; @@ -500,7 +488,7 @@ static HRESULT WINAPI InternetHostSecurityManager_ProcessUrlAction(IInternetHost ok(cbPolicy == sizeof(DWORD), "cbPolicy = %d\n", cbPolicy); ok(pContext != NULL, "pContext == NULL\n"); ok(cbContext == sizeof(GUID), "cbContext = %d\n", cbContext); - ok(IsEqualGUID(pContext, &CLSID_TestObj), "pContext = %s\n", debugstr_guid((const IID*)pContext)); + ok(IsEqualGUID(pContext, &CLSID_TestObj), "pContext = %s\n", wine_dbgstr_guid((const IID*)pContext)); ok(!dwFlags, "dwFlags = %x\n", dwFlags); ok(!dwReserved, "dwReserved = %x\n", dwReserved); @@ -517,7 +505,7 @@ static HRESULT WINAPI InternetHostSecurityManager_QueryCustomPolicy(IInternetHos CHECK_EXPECT(QueryCustomPolicy); - ok(IsEqualGUID(&GUID_CUSTOM_CONFIRMOBJECTSAFETY, guidKey), "guidKey = %s\n", debugstr_guid(guidKey)); + ok(IsEqualGUID(&GUID_CUSTOM_CONFIRMOBJECTSAFETY, guidKey), "guidKey = %s\n", wine_dbgstr_guid(guidKey)); ok(ppPolicy != NULL, "ppPolicy == NULL\n"); ok(pcbPolicy != NULL, "pcbPolicy == NULL\n"); @@ -582,13 +570,13 @@ static HRESULT WINAPI ServiceProvider_QueryService(IServiceProvider *iface, CHECK_EXPECT(Host_QS_SecMgr); else CHECK_EXPECT(Caller_QS_SecMgr); - ok(IsEqualGUID(&IID_IInternetHostSecurityManager, riid), "unexpected riid %s\n", debugstr_guid(riid)); + ok(IsEqualGUID(&IID_IInternetHostSecurityManager, riid), "unexpected riid %s\n", wine_dbgstr_guid(riid)); if(SUCCEEDED(QS_SecMgr_hres)) *ppv = &InternetHostSecurityManager; return QS_SecMgr_hres; } - ok(0, "unexpected service %s\n", debugstr_guid(guidService)); + ok(0, "unexpected service %s\n", wine_dbgstr_guid(guidService)); return E_NOINTERFACE; } @@ -1008,7 +996,7 @@ static void test_GetObject(void) SET_EXPECT(SetSite); SET_EXPECT(reportSuccess); hres = parse_script_ae(parser, "Call GetObject(\"clsid:" TESTOBJINST_CLSID "\").reportSuccess()"); - if(hres == 0x8007007e) { /* Workaround for broken win2k */ + if(hres == HRESULT_FROM_WIN32(ERROR_MOD_NOT_FOUND)) { /* Workaround for broken win2k */ win_skip("got unexpected error %08x\n", hres); CLEAR_CALLED(QI_IObjectWithSite); CLEAR_CALLED(SetSite); @@ -1016,6 +1004,7 @@ static void test_GetObject(void) IActiveScriptParse_Release(parser); return; } + ok(hres == S_OK, "hres = %08x\n", hres); CHECK_CALLED(QI_IObjectWithSite); CHECK_CALLED(SetSite); CHECK_CALLED(reportSuccess); @@ -1050,7 +1039,7 @@ static BOOL init_key(const char *key_name, const char *def_value, BOOL init) DWORD res; if(!init) { - RegDeleteKey(HKEY_CLASSES_ROOT, key_name); + RegDeleteKeyA(HKEY_CLASSES_ROOT, key_name); return TRUE; } @@ -1111,12 +1100,13 @@ START_TEST(createobj) CoInitialize(NULL); if(check_vbscript()) { - register_activex(); - - test_CreateObject(); - test_GetObject(); - - init_registry(FALSE); + if(register_activex()) { + test_CreateObject(); + test_GetObject(); + init_registry(FALSE); + }else { + skip("Could not register ActiveX object.\n"); + } }else { win_skip("Broken engine, probably too old\n"); } diff --git a/rostests/winetests/vbscript/error.vbs b/rostests/winetests/vbscript/error.vbs new file mode 100644 index 00000000000..afe9da2f32d --- /dev/null +++ b/rostests/winetests/vbscript/error.vbs @@ -0,0 +1,374 @@ +' +' Copyright 2014 Jacek Caban for CodeWeavers +' +' This library is free software; you can redistribute it and/or +' modify it under the terms of the GNU Lesser General Public +' License as published by the Free Software Foundation; either +' version 2.1 of the License, or (at your option) any later version. +' +' This library is distributed in the hope that it will be useful, +' but WITHOUT ANY WARRANTY; without even the implied warranty of +' MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +' Lesser General Public License for more details. +' +' You should have received a copy of the GNU Lesser General Public +' License along with this library; if not, write to the Free Software +' Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +' + +Option Explicit + +const E_TESTERROR = &h80080008& + +const VB_E_FORLOOPNOTINITIALIZED = 92 +const VB_E_OBJNOTCOLLECTION = 451 + +const E_NOTIMPL = &h80004001& +const E_NOINTERFACE = &h80004002& +const DISP_E_UNKNOWNINTERFACE = &h80020001& +const DISP_E_MEMBERNOTFOUND = &h80020003& +const DISP_E_PARAMNOTFOUND = &h80020004& +const DISP_E_TYPEMISMATCH = &h80020005& +const DISP_E_UNKNOWNNAME = &h80020006& +const DISP_E_NONAMEDARGS = &h80020007& +const DISP_E_BADVARTYPE = &h80020008& +const DISP_E_OVERFLOW = &h8002000A& +const DISP_E_BADINDEX = &h8002000B& +const DISP_E_UNKNOWNLCID = &h8002000C& +const DISP_E_ARRAYISLOCKED = &h8002000D& +const DISP_E_BADPARAMCOUNT = &h8002000E& +const DISP_E_PARAMNOTOPTIONAL = &h8002000F& +const DISP_E_NOTACOLLECTION = &h80020011& +const TYPE_E_DLLFUNCTIONNOTFOUND = &h8002802F& +const TYPE_E_TYPEMISMATCH = &h80028CA0& +const TYPE_E_OUTOFBOUNDS = &h80028CA1& +const TYPE_E_IOERROR = &h80028CA2& +const TYPE_E_CANTCREATETMPFILE = &h80028CA3& +const STG_E_FILENOTFOUND = &h80030002& +const STG_E_PATHNOTFOUND = &h80030003& +const STG_E_TOOMANYOPENFILES = &h80030004& +const STG_E_ACCESSDENIED = &h80030005& +const STG_E_INSUFFICIENTMEMORY = &h80030008& +const STG_E_NOMOREFILES = &h80030012& +const STG_E_DISKISWRITEPROTECTED = &h80030013& +const STG_E_WRITEFAULT = &h8003001D& +const STG_E_READFAULT = &h8003001E& +const STG_E_SHAREVIOLATION = &h80030020& +const STG_E_LOCKVIOLATION = &h80030021& +const STG_E_FILEALREADYEXISTS = &h80030050& +const STG_E_MEDIUMFULL = &h80030070& +const STG_E_INVALIDNAME = &h800300FC& +const STG_E_INUSE = &h80030100& +const STG_E_NOTCURRENT = &h80030101& +const STG_E_CANTSAVE = &h80030103& +const REGDB_E_CLASSNOTREG = &h80040154& +const MK_E_UNAVAILABLE = &h800401E3& +const MK_E_INVALIDEXTENSION = &h800401E6& +const MK_E_CANTOPENFILE = &h800401EA& +const CO_E_CLASSSTRING = &h800401F3& +const CO_E_APPNOTFOUND = &h800401F5& +const O_E_APPDIDNTREG = &h800401FE& +const E_ACCESSDENIED = &h80070005& +const E_OUTOFMEMORY = &h8007000E& +const E_INVALIDARG = &h80070057& +const RPC_S_SERVER_UNAVAILABLE = &h800706BA& +const CO_E_SERVER_EXEC_FAILURE = &h80080005& + +call ok(Err.Number = 0, "Err.Number = " & Err.Number) + +dim calledFunc + +sub returnTrue + calledFunc = true + returnTrue = true +end sub + +sub testThrow + on error resume next + + dim x, y + + call throwInt(1000) + call ok(Err.Number = 0, "Err.Number = " & Err.Number) + + call throwInt(E_TESTERROR) + call ok(Err.Number = E_TESTERROR, "Err.Number = " & Err.Number) + + call throwInt(1000) + call ok(Err.Number = E_TESTERROR, "Err.Number = " & Err.Number) + + call Err.clear() + call ok(Err.Number = 0, "Err.Number = " & Err.Number) + + x = 6 + calledFunc = false + x = throwInt(E_TESTERROR) and returnTrue() + call ok(x = 6, "x = " & x) + call ok(not calledFunc, "calledFunc = " & calledFunc) + call ok(Err.Number = E_TESTERROR, "Err.Number = " & Err.Number) + + x = false + call Err.clear() + if false and throwInt(E_TESTERROR) then + x = true + else + call ok(false, "unexpected if else branch on throw") + end if + call ok(x, "if branch not taken") + call ok(Err.Number = E_TESTERROR, "Err.Number = " & Err.Number) + + x = false + call Err.clear() + if throwInt(E_TESTERROR) then x = true + call ok(x, "if branch not taken") + call ok(Err.Number = E_TESTERROR, "Err.Number = " & Err.Number) + + x = false + call Err.clear() + if false then + call ok(false, "unexpected if else branch on throw") + elseif throwInt(E_TESTERROR) then + x = true + else + call ok(false, "unexpected if else branch on throw") + end if + call ok(x, "elseif branch not taken") + call ok(Err.Number = E_TESTERROR, "Err.Number = " & Err.Number) + + call Err.clear() + if true then + call throwInt(E_TESTERROR) + else + call ok(false, "unexpected if else branch on throw") + end if + call ok(Err.Number = E_TESTERROR, "Err.Number = " & Err.Number) + + x = false + call Err.clear() + do while throwInt(E_TESTERROR) + call ok(Err.Number = E_TESTERROR, "Err.Number = " & Err.Number) + x = true + exit do + loop + call ok(x, "if branch not taken") + call ok(Err.Number = E_TESTERROR, "Err.Number = " & Err.Number) + + x = 0 + call Err.clear() + do + x = x+1 + call ok(Err.Number = 0, "Err.Number = " & Err.Number) + loop while throwInt(E_TESTERROR) + call ok(x = 1, "if branch not taken") + call ok(Err.Number = E_TESTERROR, "Err.Number = " & Err.Number) + + x = 0 + call Err.clear() + do + x = x+1 + call ok(Err.Number = 0, "Err.Number = " & Err.Number) + loop until throwInt(E_TESTERROR) + call ok(x = 1, "if branch not taken") + call ok(Err.Number = E_TESTERROR, "Err.Number = " & Err.Number) + + call Err.clear() + x = 0 + while x < 2 + x = x+1 + call throwInt(E_TESTERROR) + wend + call ok(x = 2, "x = " & x) + call ok(Err.Number = E_TESTERROR, "Err.Number = " & Err.Number) + + call Err.clear() + x = 2 + y = 0 + for each x in throwInt(E_TESTERROR) + call ok(Err.Number = E_TESTERROR, "Err.Number = " & Err.Number) + y = y+1 + next + call ok(x = 2, "x = " & x) + call ok(y = 1, "y = " & y) + 'todo_wine call ok(Err.Number = VB_E_OBJNOTCOLLECTION, "Err.Number = " & Err.Number) + + Err.clear() + y = 0 + x = 6 + for x = throwInt(E_TESTERROR) to 100 + call ok(Err.Number = E_TESTERROR, "Err.Number = " & Err.Number) + call ok(x = 6, "x = " & x) + y = y+1 + next + call ok(y = 1, "y = " & y) + call ok(x = 6, "x = " & x) + 'todo_wine call ok(Err.Number = VB_E_FORLOOPNOTINITIALIZED, "Err.Number = " & Err.Number) + + Err.clear() + y = 0 + x = 6 + for x = 100 to throwInt(E_TESTERROR) + call ok(Err.Number = E_TESTERROR, "Err.Number = " & Err.Number) + 'todo_wine call ok(x = 6, "x = " & x) + y = y+1 + next + call ok(y = 1, "y = " & y) + 'todo_wine call ok(x = 6, "x = " & x) + 'todo_wine call ok(Err.Number = VB_E_FORLOOPNOTINITIALIZED, "Err.Number = " & Err.Number) + + select case throwInt(E_TESTERROR) + case true + call ok(false, "unexpected case true") + case false + call ok(false, "unexpected case false") + case empty + call ok(false, "unexpected case empty") + case else + call ok(false, "unexpected case else") + end select + call ok(Err.Number = E_TESTERROR, "Err.Number = " & Err.Number) + + x = false + select case false + case true + call ok(false, "unexpected case true") + case throwInt(E_TESTERROR) + x = true + case else + call ok(false, "unexpected case else") + end select + call ok(x, "case not executed") + call ok(Err.Number = E_TESTERROR, "Err.Number = " & Err.Number) + + 'Exception in non-trivial stack context + for x = 1 to 1 + for each y in collectionObj + select case 3 + case 1 + call ok(false, "unexpected case") + case throwInt(E_TESTERROR) + exit for + case 2 + call ok(false, "unexpected case") + end select + next + next +end sub + +call testThrow + +dim x + +sub testOnError(resumeNext) + if resumeNext then + on error resume next + else + on error goto 0 + end if + x = 1 + throwInt(E_TESTERROR) + x = 2 + call ok(Err.Number = E_TESTERROR, "Err.Number = " & Err.Number) +end sub + +sub callTestOnError(resumeNext) + on error resume next + call testOnError(resumeNext) + call ok(Err.Number = E_TESTERROR, "Err.Number = " & Err.Number) +end sub + +x = 0 +call callTestOnError(true) +call ok(x = 2, "x = " & x) + +x = 0 +call callTestOnError(false) +call ok(x = 1, "x = " & x) + +sub testForEachError() + on error resume next + + dim x, y + y = false + for each x in empty + y = true + next + call ok(y, "for each not executed") + 'todo_wine call ok(Err.Number = VB_E_OBJNOTCOLLECTION, "Err.Number = " & Err.Number) +end sub + +call testForEachError() + +sub testHresMap(hres, code) + on error resume next + + call Err.Clear() + call throwInt(hres) + call ok(Err.Number = code, "throw(" & hex(hres) & ") Err.Number = " & Err.Number) +end sub + +testHresMap E_NOTIMPL, 445 +testHresMap E_NOINTERFACE, 430 +testHresMap DISP_E_UNKNOWNINTERFACE, 438 +testHresMap DISP_E_MEMBERNOTFOUND, 438 +testHresMap DISP_E_PARAMNOTFOUND, 448 +testHresMap DISP_E_TYPEMISMATCH, 13 +testHresMap DISP_E_UNKNOWNNAME, 438 +testHresMap DISP_E_NONAMEDARGS, 446 +testHresMap DISP_E_BADVARTYPE, 458 +testHresMap DISP_E_OVERFLOW, 6 +testHresMap DISP_E_BADINDEX, 9 +testHresMap DISP_E_UNKNOWNLCID, 447 +testHresMap DISP_E_ARRAYISLOCKED, 10 +testHresMap DISP_E_BADPARAMCOUNT, 450 +testHresMap DISP_E_PARAMNOTOPTIONAL, 449 +testHresMap DISP_E_NOTACOLLECTION, 451 +testHresMap TYPE_E_DLLFUNCTIONNOTFOUND, 453 +testHresMap TYPE_E_TYPEMISMATCH, 13 +testHresMap TYPE_E_OUTOFBOUNDS, 9 +testHresMap TYPE_E_IOERROR, 57 +testHresMap TYPE_E_CANTCREATETMPFILE, 322 +testHresMap STG_E_FILENOTFOUND, 432 +testHresMap STG_E_PATHNOTFOUND, 76 +testHresMap STG_E_TOOMANYOPENFILES, 67 +testHresMap STG_E_ACCESSDENIED, 70 +testHresMap STG_E_INSUFFICIENTMEMORY, 7 +testHresMap STG_E_NOMOREFILES, 67 +testHresMap STG_E_DISKISWRITEPROTECTED, 70 +testHresMap STG_E_WRITEFAULT, 57 +testHresMap STG_E_READFAULT, 57 +testHresMap STG_E_SHAREVIOLATION, 75 +testHresMap STG_E_LOCKVIOLATION, 70 +testHresMap STG_E_FILEALREADYEXISTS, 58 +testHresMap STG_E_MEDIUMFULL, 61 +testHresMap STG_E_INVALIDNAME, 53 +testHresMap STG_E_INUSE, 70 +testHresMap STG_E_NOTCURRENT, 70 +testHresMap STG_E_CANTSAVE, 57 +testHresMap REGDB_E_CLASSNOTREG, 429 +testHresMap MK_E_UNAVAILABLE, 429 +testHresMap MK_E_INVALIDEXTENSION, 432 +testHresMap MK_E_CANTOPENFILE, 432 +testHresMap CO_E_CLASSSTRING, 429 +testHresMap CO_E_APPNOTFOUND, 429 +testHresMap O_E_APPDIDNTREG, 429 +testHresMap E_ACCESSDENIED, 70 +testHresMap E_OUTOFMEMORY, 7 +testHresMap E_INVALIDARG, 5 +testHresMap RPC_S_SERVER_UNAVAILABLE, 462 +testHresMap CO_E_SERVER_EXEC_FAILURE, 429 + +sub testVBErrorCodes() + on error resume next + + Err.clear() + throwInt(&h800a00aa&) + call ok(Err.number = 170, "Err.number = " & Err.number) + + Err.clear() + throwInt(&h800a10aa&) + call ok(Err.number = 4266, "Err.number = " & Err.number) +end sub + +call testVBErrorCodes + +call reportSuccess() diff --git a/rostests/winetests/vbscript/lang.vbs b/rostests/winetests/vbscript/lang.vbs index 8cffc7fa9c8..d3e83183b50 100644 --- a/rostests/winetests/vbscript/lang.vbs +++ b/rostests/winetests/vbscript/lang.vbs @@ -19,6 +19,7 @@ Option Explicit dim x, y, z +Dim obj call ok(true, "true is not true?") ok true, "true is not true?" @@ -224,6 +225,10 @@ if false then x = y : if true then call ok(false, "embedded if called") if false then x=1 else x=2 end if +x = false +if false then x = true : x = true +Call ok(x = false, "x <> false") + if false then ok false, "if false called" end if @@ -482,6 +487,17 @@ next Call ok(y = 1, "y = " & y) Call ok(x = 2, "x = " & x) +Set obj = collectionObj +Call obj.reset() +y = 0 +x = 10 +for each x in obj + y = y+1 + Call ok(x = y, "x <> y") +next +Call ok(y = 3, "y = " & y) +Call ok(getVT(x) = "VT_EMPTY*", "getVT(x) = " & getVT(x)) + x = false select case 3 case 2 @@ -538,6 +554,22 @@ end select select case 0 end select +x = false +select case 2 + case 3,1,2,4: x = true + case 5,6,7 + Call ok(false, "unexpected case") +end select +Call ok(x, "wrong case") + +x = false +select case 2: case 5,6,7: Call ok(false, "unexpected case") + case 2,1,2,4 + x = true + case else: Call ok(false, "unexpected case else") +end select +Call ok(x, "wrong case") + if false then Sub testsub x = true @@ -747,7 +779,6 @@ Stop set x = testObj Call ok(getVT(x) = "VT_DISPATCH*", "getVT(x=testObj) = " & getVT(x)) -Dim obj Set obj = New EmptyClass Call ok(getVT(obj) = "VT_DISPATCH*", "getVT(obj) = " & getVT(obj)) @@ -814,6 +845,9 @@ Class TestClass Public Sub Class_Initialize publicProp2 = 2 privateProp = true + Call ok(getVT(privateProp) = "VT_BOOL*", "getVT(privateProp) = " & getVT(privateProp)) + Call ok(getVT(publicProp2) = "VT_I2*", "getVT(publicProp2) = " & getVT(publicProp2)) + Call ok(getVT(Me.publicProp2) = "VT_I2", "getVT(Me.publicProp2) = " & getVT(Me.publicProp2)) End Sub End Class @@ -830,6 +864,7 @@ Call obj.publicFunction() Call ok(getVT(obj.publicProp) = "VT_EMPTY", "getVT(obj.publicProp) = " & getVT(obj.publicProp)) obj.publicProp = 3 +Call ok(getVT(obj.publicProp) = "VT_I2", "getVT(obj.publicProp) = " & getVT(obj.publicProp)) Call ok(obj.publicProp = 3, "obj.publicProp = " & obj.publicProp) obj.publicProp() = 3 @@ -964,7 +999,6 @@ Class Property2 Function Property() End Function - Sub Test(property) End Sub @@ -972,4 +1006,142 @@ Class Property2 End Sub End Class +' Array tests + +Call ok(getVT(arr) = "VT_EMPTY*", "getVT(arr) = " & getVT(arr)) + +Dim arr(3) +Dim arr2(4,3), arr3(5,4,3), arr0(0), noarr() + +Call ok(getVT(arr) = "VT_ARRAY|VT_BYREF|VT_VARIANT*", "getVT(arr) = " & getVT(arr)) +Call ok(getVT(arr2) = "VT_ARRAY|VT_BYREF|VT_VARIANT*", "getVT(arr2) = " & getVT(arr2)) +Call ok(getVT(arr0) = "VT_ARRAY|VT_BYREF|VT_VARIANT*", "getVT(arr0) = " & getVT(arr0)) +Call ok(getVT(noarr) = "VT_ARRAY|VT_BYREF|VT_VARIANT*", "getVT(noarr) = " & getVT(noarr)) + +Call testArray(1, arr) +Call testArray(2, arr2) +Call testArray(3, arr3) +Call testArray(0, arr0) +Call testArray(-1, noarr) + +Call ok(getVT(arr(1)) = "VT_EMPTY*", "getVT(arr(1)) = " & getVT(arr(1))) +Call ok(getVT(arr2(1,2)) = "VT_EMPTY*", "getVT(arr2(1,2)) = " & getVT(arr2(1,2))) +Call ok(getVT(arr3(1,2,2)) = "VT_EMPTY*", "getVT(arr3(1,2,3)) = " & getVT(arr3(1,2,2))) +Call ok(getVT(arr(0)) = "VT_EMPTY*", "getVT(arr(0)) = " & getVT(arr(0))) +Call ok(getVT(arr(3)) = "VT_EMPTY*", "getVT(arr(3)) = " & getVT(arr(3))) +Call ok(getVT(arr0(0)) = "VT_EMPTY*", "getVT(arr0(0)) = " & getVT(arr0(0))) + +arr(2) = 3 +Call ok(arr(2) = 3, "arr(2) = " & arr(2)) +Call ok(getVT(arr(2)) = "VT_I2*", "getVT(arr(2)) = " & getVT(arr(2))) + +arr3(3,2,1) = 1 +arr3(1,2,3) = 2 +Call ok(arr3(3,2,1) = 1, "arr3(3,2,1) = " & arr3(3,2,1)) +Call ok(arr3(1,2,3) = 2, "arr3(1,2,3) = " & arr3(1,2,3)) + +x = arr3 +Call ok(x(3,2,1) = 1, "x(3,2,1) = " & x(3,2,1)) + +Function getarr() + Dim arr(3) + arr(2) = 2 + getarr = arr + arr(3) = 3 +End Function + +x = getarr() +Call ok(getVT(x) = "VT_ARRAY|VT_VARIANT*", "getVT(x) = " & getVT(x)) +Call ok(x(2) = 2, "x(2) = " & x(2)) +Call ok(getVT(x(3)) = "VT_EMPTY*", "getVT(x(3)) = " & getVT(x(3))) + +x(1) = 1 +Call ok(x(1) = 1, "x(1) = " & x(1)) +x = getarr() +Call ok(getVT(x(1)) = "VT_EMPTY*", "getVT(x(1)) = " & getVT(x(1))) +Call ok(x(2) = 2, "x(2) = " & x(2)) + +x(1) = 1 +y = x +x(1) = 2 +Call ok(y(1) = 1, "y(1) = " & y(1)) + +for x=1 to 1 + Dim forarr(3) + if x=1 then + Call ok(getVT(forarr(1)) = "VT_EMPTY*", "getVT(forarr(1)) = " & getVT(forarr(1))) + else + Call ok(forarr(1) = x, "forarr(1) = " & forarr(1)) + end if + forarr(1) = x+1 +next + +x=1 +Call ok(forarr(x) = 2, "forarr(x) = " & forarr(x)) + +Class ArrClass + Dim classarr(3) + Dim classnoarr() + Dim var + + Private Sub Class_Initialize + Call ok(getVT(classarr) = "VT_ARRAY|VT_BYREF|VT_VARIANT*", "getVT(classarr) = " & getVT(classarr)) + Call testArray(-1, classnoarr) + classarr(0) = 1 + classarr(1) = 2 + classarr(2) = 3 + classarr(3) = 4 + End Sub + + Public Sub testVarVT + Call ok(getVT(var) = "VT_ARRAY|VT_VARIANT*", "getVT(var) = " & getVT(var)) + End Sub +End Class + +Set obj = new ArrClass +Call ok(getVT(obj.classarr) = "VT_ARRAY|VT_VARIANT", "getVT(obj.classarr) = " & getVT(obj.classarr)) +'todo_wine Call ok(obj.classarr(1) = 2, "obj.classarr(1) = " & obj.classarr(1)) + +obj.var = arr +Call ok(getVT(obj.var) = "VT_ARRAY|VT_VARIANT", "getVT(obj.var) = " & getVT(obj.var)) +Call obj.testVarVT + +Sub arrarg(byref refarr, byval valarr, byref refarr2, byval valarr2) + Call ok(getVT(refarr) = "VT_ARRAY|VT_BYREF|VT_VARIANT*", "getVT(refarr) = " & getVT(refarr)) + Call ok(getVT(valarr) = "VT_ARRAY|VT_VARIANT*", "getVT(valarr) = " & getVT(valarr)) + Call ok(getVT(refarr2) = "VT_ARRAY|VT_VARIANT*", "getVT(refarr2) = " & getVT(refarr2)) + Call ok(getVT(valarr2) = "VT_ARRAY|VT_VARIANT*", "getVT(valarr2) = " & getVT(valarr2)) +End Sub + +Call arrarg(arr, arr, obj.classarr, obj.classarr) + +Sub arrarg2(byref refarr(), byval valarr(), byref refarr2(), byval valarr2()) + Call ok(getVT(refarr) = "VT_ARRAY|VT_BYREF|VT_VARIANT*", "getVT(refarr) = " & getVT(refarr)) + Call ok(getVT(valarr) = "VT_ARRAY|VT_VARIANT*", "getVT(valarr) = " & getVT(valarr)) + Call ok(getVT(refarr2) = "VT_ARRAY|VT_VARIANT*", "getVT(refarr2) = " & getVT(refarr2)) + Call ok(getVT(valarr2) = "VT_ARRAY|VT_VARIANT*", "getVT(valarr2) = " & getVT(valarr2)) +End Sub + +Call arrarg2(arr, arr, obj.classarr, obj.classarr) + +Sub testarrarg(arg(), vt) + Call ok(getVT(arg) = vt, "getVT() = " & getVT(arg) & " expected " & vt) +End Sub + +Call testarrarg(1, "VT_I2*") +Call testarrarg(false, "VT_BOOL*") +Call testarrarg(Empty, "VT_EMPTY*") + +' It's allowed to declare non-builtin RegExp class... +class RegExp + public property get Global() + Call ok(false, "Global called") + Global = "fail" + end property +end class + +' ...but there is no way to use it because builtin instance is always created +set x = new RegExp +Call ok(x.Global = false, "x.Global = " & x.Global) + reportSuccess() diff --git a/rostests/winetests/vbscript/regexp.vbs b/rostests/winetests/vbscript/regexp.vbs index 72fa108a7e0..0354fb77f44 100644 --- a/rostests/winetests/vbscript/regexp.vbs +++ b/rostests/winetests/vbscript/regexp.vbs @@ -168,4 +168,10 @@ Call ok(submatch.Count = 2, "submatch.Count = " & submatch.Count) Call ok(submatch.Item(0) = "a", "submatch.Item(0) = " & submatch.Item(0)) Call ok(submatch.Item(1) = "b", "submatch.Item(0) = " & submatch.Item(1)) +Set x = new regexp +Call ok(x.Pattern = "", "RegExp.Pattern = " & x.Pattern) +Call ok(x.IgnoreCase = false, "RegExp.IgnoreCase = " & x.IgnoreCase) +Call ok(x.Global = false, "RegExp.Global = " & x.Global) +Call ok(x.Multiline = false, "RegExp.Multiline = " & x.Multiline) + Call reportSuccess() diff --git a/rostests/winetests/vbscript/rsrc.rc b/rostests/winetests/vbscript/rsrc.rc index 1fb34407e66..87d08e751d2 100644 --- a/rostests/winetests/vbscript/rsrc.rc +++ b/rostests/winetests/vbscript/rsrc.rc @@ -19,6 +19,9 @@ /* @makedep: api.vbs */ api.vbs 40 "api.vbs" +/* @makedep: error.vbs */ +error.vbs 40 "error.vbs" + /* @makedep: lang.vbs */ lang.vbs 40 "lang.vbs" diff --git a/rostests/winetests/vbscript/run.c b/rostests/winetests/vbscript/run.c index e471b44612f..3a130ed6406 100644 --- a/rostests/winetests/vbscript/run.c +++ b/rostests/winetests/vbscript/run.c @@ -119,12 +119,17 @@ DEFINE_EXPECT(EnableModeless); #define DISPID_GLOBAL_PROPARGPUT1 1012 #define DISPID_GLOBAL_COLLOBJ 1013 #define DISPID_GLOBAL_DOUBLEASSTRING 1014 +#define DISPID_GLOBAL_TESTARRAY 1015 +#define DISPID_GLOBAL_THROWINT 1016 #define DISPID_TESTOBJ_PROPGET 2000 #define DISPID_TESTOBJ_PROPPUT 2001 #define DISPID_COLLOBJ_RESET 3000 +#define FACILITY_VBS 0xa +#define MAKE_VBSERROR(code) MAKE_HRESULT(SEVERITY_ERROR, FACILITY_VBS, code) + static const WCHAR testW[] = {'t','e','s','t',0}; static const WCHAR emptyW[] = {0}; @@ -152,18 +157,6 @@ static int strcmp_wa(LPCWSTR strw, const char *stra) return lstrcmpA(buf, stra); } -static const char *debugstr_guid(REFIID riid) -{ - static char buf[50]; - - sprintf(buf, "{%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}", - riid->Data1, riid->Data2, riid->Data3, riid->Data4[0], - riid->Data4[1], riid->Data4[2], riid->Data4[3], riid->Data4[4], - riid->Data4[5], riid->Data4[6], riid->Data4[7]); - - return buf; -} - static const char *vt2a(VARIANT *v) { if(V_VT(v) == (VT_BYREF|VT_VARIANT)) { @@ -193,6 +186,8 @@ static const char *vt2a(VARIANT *v) return "VT_BOOL"; case VT_ARRAY|VT_VARIANT: return "VT_ARRAY|VT_VARIANT"; + case VT_ARRAY|VT_BYREF|VT_VARIANT: + return "VT_ARRAY|VT_BYREF|VT_VARIANT"; default: ok(0, "unknown vt %d\n", V_VT(v)); return NULL; @@ -241,7 +236,7 @@ static ULONG WINAPI ServiceProvider_Release(IServiceProvider *iface) static HRESULT WINAPI ServiceProvider_QueryService(IServiceProvider *iface, REFGUID guidService, REFIID riid, void **ppv) { - ok(0, "unexpected service %s\n", debugstr_guid(guidService)); + ok(0, "unexpected service %s\n", wine_dbgstr_guid(guidService)); return E_NOINTERFACE; } @@ -446,6 +441,26 @@ static void test_disp(IDispatch *disp) IDispatchEx_Release(dispex); } +static void test_safearray(SAFEARRAY *safearray, unsigned indims) +{ + int i, exdims = indims; + + if(!exdims) + exdims = 1; + ok(safearray->cDims == exdims, "safearray->cDims = %d, expected %d\n", safearray->cDims, exdims); + todo_wine + ok(safearray->fFeatures == (FADF_VARIANT|FADF_HAVEVARTYPE|FADF_FIXEDSIZE|FADF_STATIC), + "safearray->fFeatures = %x\n", safearray->fFeatures); + ok(safearray->cbElements == sizeof(VARIANT), "safearray->cbElements = %x\n", safearray->cbElements); + ok(!safearray->cLocks, "safearray->cLocks = %x\n", safearray->cLocks); + + for(i=0; i < safearray->cDims; i++) { + ok(safearray->rgsabound[i].cElements == indims ? i+4 : 1, "safearray->rgsabound[%d].cElements = %d\n", i, + safearray->rgsabound[i].cElements); + ok(!safearray->rgsabound[i].lLbound, "safearray->rgsabound[%d].lLbound = %d\n", i, safearray->rgsabound[i].lLbound); + } +} + #define test_grfdex(a,b) _test_grfdex(__LINE__,a,b) static void _test_grfdex(unsigned line, DWORD grfdex, DWORD expect) { @@ -466,7 +481,7 @@ static HRESULT WINAPI EnumVARIANT_QueryInterface(IEnumVARIANT *iface, REFIID rii return S_OK; } - ok(0, "unexpected call %s\n", debugstr_guid(riid)); + ok(0, "unexpected call %s\n", wine_dbgstr_guid(riid)); return E_NOINTERFACE; } @@ -539,7 +554,7 @@ static HRESULT WINAPI DispatchEx_QueryInterface(IDispatchEx *iface, REFIID riid, || IsEqualGUID(riid, &IID_IDispatchEx)) *ppv = iface; else { - trace("QI %s\n", debugstr_guid(riid)); + trace("QI %s\n", wine_dbgstr_guid(riid)); return E_NOINTERFACE; } @@ -913,6 +928,16 @@ static HRESULT WINAPI Global_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD *pid = DISPID_GLOBAL_DOUBLEASSTRING; return S_OK; } + if(!strcmp_wa(bstrName, "testArray")) { + test_grfdex(grfdex, fdexNameCaseInsensitive); + *pid = DISPID_GLOBAL_TESTARRAY; + return S_OK; + } + if(!strcmp_wa(bstrName, "throwInt")) { + test_grfdex(grfdex, fdexNameCaseInsensitive); + *pid = DISPID_GLOBAL_THROWINT; + return S_OK; + } if(strict_dispid_check && strcmp_wa(bstrName, "x")) ok(0, "unexpected call %s %x\n", wine_dbgstr_w(bstrName), grfdex); @@ -1171,6 +1196,61 @@ static HRESULT WINAPI Global_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, V_VT(pvarRes) = VT_BSTR; return VarBstrFromR8(V_R8(pdp->rgvarg), 0, 0, &V_BSTR(pvarRes)); + + case DISPID_GLOBAL_TESTARRAY: + ok(wFlags == INVOKE_FUNC, "wFlags = %x\n", wFlags); + ok(pdp != NULL, "pdp == NULL\n"); + ok(pdp->rgvarg != NULL, "rgvarg == NULL\n"); + ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n"); + ok(pdp->cArgs == 2, "cArgs = %d\n", pdp->cArgs); + ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs); + ok(!pvarRes, "pvarRes != NULL\n"); + ok(pei != NULL, "pei == NULL\n"); + + ok(V_VT(pdp->rgvarg+1) == VT_I2, "V_VT(psp->rgvargs+1) = %d\n", V_VT(pdp->rgvarg+1)); + ok(V_VT(pdp->rgvarg) == (VT_BYREF|VT_VARIANT), "V_VT(psp->rgvargs) = %d\n", V_VT(pdp->rgvarg)); + ok(V_VT(V_VARIANTREF(pdp->rgvarg)) == (VT_ARRAY|VT_BYREF|VT_VARIANT), + "V_VT(V_VARIANTREF(psp->rgvargs)) = %d\n", V_VT(V_VARIANTREF(pdp->rgvarg))); + if(V_I2(pdp->rgvarg+1) == -1) + ok(!*V_ARRAYREF(V_VARIANTREF(pdp->rgvarg)), "*V_ARRAYREF(V_VARIANTREF(pdp->rgvarg)) != NULL\n"); + else + test_safearray(*V_ARRAYREF(V_VARIANTREF(pdp->rgvarg)), V_I2(pdp->rgvarg+1)); + return S_OK; + + case DISPID_GLOBAL_THROWINT: { + VARIANT *v = pdp->rgvarg; + HRESULT hres; + + ok((wFlags & ~INVOKE_PROPERTYGET) == INVOKE_FUNC, "wFlags = %x\n", wFlags); + ok(pdp != NULL, "pdp == NULL\n"); + ok(pdp->rgvarg != NULL, "rgvarg == NULL\n"); + ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n"); + ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs); + ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs); + ok(pei != NULL, "pei == NULL\n"); + if(pvarRes) { + ok(V_VT(pvarRes) == VT_EMPTY, "V_VT(pvarRes) = %d\n", V_VT(pvarRes)); + V_VT(pvarRes) = VT_BOOL; + V_BOOL(pvarRes) = VARIANT_FALSE; + } + + if(V_VT(v) == (VT_VARIANT|VT_BYREF)) + v = V_VARIANTREF(v); + + switch(V_VT(v)) { + case VT_I2: + hres = V_I2(v); + break; + case VT_I4: + hres = V_I4(v); + break; + default: + ok(0, "unexpected vt %d\n", V_VT(v)); + return E_INVALIDARG; + } + + return hres; + } } ok(0, "unexpected call %d\n", id); @@ -1733,7 +1813,7 @@ static BSTR get_script_from_file(const char *filename) size = GetFileSize(file, NULL); - map = CreateFileMapping(file, NULL, PAGE_READONLY, 0, 0, NULL); + map = CreateFileMappingW(file, NULL, PAGE_READONLY, 0, 0, NULL); CloseHandle(file); if(map == INVALID_HANDLE_VALUE) { trace("Could not create file mapping: %u\n", GetLastError()); @@ -1912,6 +1992,20 @@ static void run_tests(void) test_global_vars_ref(TRUE); test_global_vars_ref(FALSE); + hres = parse_script_ar("throwInt(&h80080008&)"); + ok(hres == 0x80080008, "hres = %08x\n", hres); + + /* DISP_E_BADINDEX */ + hres = parse_script_ar("throwInt(&h8002000b&)"); + ok(hres == MAKE_VBSERROR(9), "hres = %08x\n", hres); + + hres = parse_script_ar("throwInt(&h800a0009&)"); + ok(hres == MAKE_VBSERROR(9), "hres = %08x\n", hres); + + /* E_NOTIMPL */ + hres = parse_script_ar("throwInt(&h80004001&)"); + ok(hres == MAKE_VBSERROR(445), "hres = %08x\n", hres); + strict_dispid_check = FALSE; parse_script_a("Sub testsub\n" @@ -1931,6 +2025,7 @@ static void run_tests(void) run_from_res("lang.vbs"); run_from_res("api.vbs"); run_from_res("regexp.vbs"); + run_from_res("error.vbs"); test_procedures(); test_gc();