fixes https://bugs.winehq.org/show_bug.cgi?id=53767
-- v12: vbscript: fix Mid() empty and null handling vbscript: refactor Mid() error tests
From: Francis De Brabandere francisdb@gmail.com
--- dlls/vbscript/tests/api.vbs | 68 +++++++++++++------------------------ 1 file changed, 23 insertions(+), 45 deletions(-)
diff --git a/dlls/vbscript/tests/api.vbs b/dlls/vbscript/tests/api.vbs index 7b8744f4c74..296663d9c97 100644 --- a/dlls/vbscript/tests/api.vbs +++ b/dlls/vbscript/tests/api.vbs @@ -632,6 +632,15 @@ Sub TestMid2(str, start, ex) Call ok(x = ex, "Mid(" & str & ", " & start & ") = " & x & " expected " & ex) End Sub
+Sub TestMidError(str, start, len, number) + On Error Resume Next + Call Mid(str, start, len) + Dim err_num: err_num = Err.number + Call Err.clear() + On Error GoTo 0 + Call ok(err_num = number, "Mid(" & str & ", " & start & ", " & len & ") " & " expected Err.number = " & number) +End Sub + TestMid "test", 2, 2, "es" TestMid "test", 2, 4, "est" TestMid "test", 1, 2, "te" @@ -646,51 +655,20 @@ TestMid2 "test", 4, "t" TestMid2 "test", 5, "" TestMid2 1234, 5, ""
-sub TestMidError() - on error resume next - call Err.clear() - call Mid("test", "a", 1) - call ok(Err.number = 13, "Err.number = " & Err.number) - call Err.clear() - call Mid("test", "a", null) - call ok(Err.number = 94, "Err.number = " & Err.number) - call Err.clear() - call Mid("test", "a", empty) - call ok(Err.number = 13, "Err.number = " & Err.number) - call Mid("test", 0, -1) - call ok(Err.number = 5, "Err.number = " & Err.number) - call Err.clear() - call Mid("test", -1, -1) - call ok(Err.number = 5, "Err.number = " & Err.number) - call Err.clear() - call Mid(null, -1, -1) - call ok(Err.number = 5, "Err.number = " & Err.number) - call Err.clear() - call Mid("test", 0, null) - call ok(Err.number = 94, "Err.number = " & Err.number) - call Err.clear() - call Mid("test", -1, null) - call ok(Err.number = 94, "Err.number = " & Err.number) - call Err.clear() - call Mid("test", null, 2) - call ok(Err.number = 94, "Err.number = " & Err.number) - call Err.clear() - call Mid("test", null, -1) - call ok(Err.number = 94, "Err.number = " & Err.number) - call Err.clear() - call Mid(null, -1, -1) - call ok(Err.number = 5, "Err.number = " & Err.number) - call Err.clear() - call Mid("test", empty, 1) - call ok(Err.number = 5, "Err.number = " & Err.number) - call Err.clear() - call Mid("test", 0, empty) - call ok(Err.number = 5, "Err.number = " & Err.number) - call Err.clear() - call Mid(empty, 0, 0) - call ok(Err.number = 5, "Err.number = " & Err.number) -end sub -call TestMidError() +TestMidError "test", "a", 1, 13 +TestMidError "test", "a", null, 94 +TestMidError "test", "a", empty, 13 +TestMidError "test", 0, 3, 5 +TestMidError "test", 0, -1, 5 +TestMidError "test", -1, -1, 5 +TestMidError "test", 0, null, 94 +TestMidError "test", -1, null, 94 +TestMidError "test", null, 2, 94 +TestMidError "test", null, -1, 94 +TestMidError null, -1, -1, 5 +TestMidError "test", empty, 1, 5 +TestMidError "test", 0, empty, 5 +TestMidError empty, 0, 0, 5
Sub TestUCase(str, ex) x = UCase(str)
From: Francis De Brabandere francisdb@gmail.com
--- dlls/vbscript/global.c | 11 +++++++---- dlls/vbscript/tests/api.vbs | 15 +++++++++++++++ 2 files changed, 22 insertions(+), 4 deletions(-)
diff --git a/dlls/vbscript/global.c b/dlls/vbscript/global.c index 058ddabcde1..972d0d2ea0b 100644 --- a/dlls/vbscript/global.c +++ b/dlls/vbscript/global.c @@ -1404,9 +1404,6 @@ static HRESULT Global_Mid(BuiltinDisp *This, VARIANT *args, unsigned args_cnt, V
assert(args_cnt == 2 || args_cnt == 3);
- if(V_VT(args) == VT_EMPTY) - return MAKE_VBSERROR(VBSE_ILLEGAL_FUNC_CALL); - if(V_VT(args+1) == VT_NULL || (args_cnt == 3 && V_VT(args+2) == VT_NULL)) return MAKE_VBSERROR(VBSE_ILLEGAL_NULL_USE);
@@ -1417,7 +1414,7 @@ static HRESULT Global_Mid(BuiltinDisp *This, VARIANT *args, unsigned args_cnt, V if(FAILED(hres)) return hres;
- if(start < 0) + if(start <= 0) return MAKE_VBSERROR(VBSE_ILLEGAL_FUNC_CALL);
if(args_cnt == 3) { @@ -1432,6 +1429,12 @@ static HRESULT Global_Mid(BuiltinDisp *This, VARIANT *args, unsigned args_cnt, V return MAKE_VBSERROR(VBSE_ILLEGAL_FUNC_CALL); }
+ if(V_VT(args) == VT_EMPTY) + return return_string(res, L""); + + if(V_VT(args) == VT_NULL) + return return_null(res); + if(V_VT(args) == VT_BSTR) { str = V_BSTR(args); }else { diff --git a/dlls/vbscript/tests/api.vbs b/dlls/vbscript/tests/api.vbs index 296663d9c97..dfa2816bec5 100644 --- a/dlls/vbscript/tests/api.vbs +++ b/dlls/vbscript/tests/api.vbs @@ -632,6 +632,16 @@ Sub TestMid2(str, start, ex) Call ok(x = ex, "Mid(" & str & ", " & start & ") = " & x & " expected " & ex) End Sub
+Sub TestMidNull(str, start, len) + x = Mid(str, start, len) + Call ok(IsNull(x), "Mid(" & str & ", " & start & ", " & len & ") = " & x & " expected Null") +End Sub + +Sub TestMidNull2(str, start) + x = Mid(str, start) + Call ok(IsNull(x), "Mid(" & str & ", " & start & ") = " & x & " expected Null") +End Sub + Sub TestMidError(str, start, len, number) On Error Resume Next Call Mid(str, start, len) @@ -654,6 +664,11 @@ TestMid2 "test", 2, "est" TestMid2 "test", 4, "t" TestMid2 "test", 5, "" TestMid2 1234, 5, "" +TestMid empty, 5, 2, "" +TestMid2 empty, 5, "" + +TestMidNull null, 5, 2 +TestMidNull2 null, 5
TestMidError "test", "a", 1, 13 TestMidError "test", "a", null, 94
On Wed Jan 8 13:21:20 2025 +0000, Francis De Brabandere wrote:
@jacek Is there a place where compiler error tests can be added. Making sure that certain things throw compile errors instead of runtime errors?
Yes, see `parse_script_wr` calls in `run.c`.