Jacek Caban : vbscript/tests: Add error position tests.

Alexandre Julliard julliard at winehq.org
Thu Jan 23 15:48:48 CST 2020


Module: wine
Branch: master
Commit: d12de646635d717e7a580f23d5ae35da7da81319
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=d12de646635d717e7a580f23d5ae35da7da81319

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Wed Jan 22 23:27:03 2020 +0100

vbscript/tests: Add error position tests.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/vbscript/tests/run.c | 194 ++++++++++++++++++++++++++++++++++------------
 1 file changed, 143 insertions(+), 51 deletions(-)

diff --git a/dlls/vbscript/tests/run.c b/dlls/vbscript/tests/run.c
index d45416a94a..696c3f530b 100644
--- a/dlls/vbscript/tests/run.c
+++ b/dlls/vbscript/tests/run.c
@@ -1829,21 +1829,22 @@ static HRESULT WINAPI ActiveScriptSite_OnStateChange(IActiveScriptSite *iface, S
 }
 
 static IActiveScriptError **store_script_error;
+static ULONG error_line;
+static LONG error_char;
 
 static HRESULT WINAPI ActiveScriptSite_OnScriptError(IActiveScriptSite *iface, IActiveScriptError *pscripterror)
 {
     HRESULT hr = onerror_hres, hres;
 
+    hres = IActiveScriptError_GetSourcePosition(pscripterror, NULL, &error_line, &error_char);
+    ok(hres == S_OK, "GetSourcePosition failed: %08x\n", hres);
+
     if(!expect_OnScriptError) {
         EXCEPINFO info;
-        ULONG line;
-        HRESULT hres;
 
-        hres = IActiveScriptError_GetSourcePosition(pscripterror, NULL, &line, NULL);
+        hres = IActiveScriptError_GetExceptionInfo(pscripterror, &info);
         if(SUCCEEDED(hres))
-            hres = IActiveScriptError_GetExceptionInfo(pscripterror, &info);
-        if(SUCCEEDED(hres))
-            trace("Error in line %u: %x %s\n", line+1, info.wCode, wine_dbgstr_w(info.bstrDescription));
+            trace("Error in line %u: %x %s\n", error_line + 1, info.wCode, wine_dbgstr_w(info.bstrDescription));
     }else {
         IDispatchEx *dispex;
 
@@ -2390,60 +2391,151 @@ static void test_gc(void)
 
 static void test_parse_errors(void)
 {
-    static const char *invalid_scripts[] =
+    static const struct
+    {
+        const char *src;
+        unsigned error_line;
+        int error_char;
+    }
+    invalid_scripts[] =
     {
-        /* If...End If */
-        "If 0 > 1 Then\n"
-        "    x = 0 End If\n",
-
-        /* While...End While */
-        "While False\n"
-        "    x = 0 End While\n",
-
-        /* While...Wend */
-        "While False\n"
-        "    x = 0 Wend\n",
-
-        /* Do While...Loop */
-        "Do While False\n"
-        "    x = 0 Loop\n",
-
-        /* Do Until...Loop */
-        "Do Until True\n"
-        "    x = 0 Loop\n",
-
-        /* Do...Loop While */
-        "Do\n"
-        "    x = 0 Loop While False\n",
-
-        /* Do...Loop Until */
-        "Do\n"
-        "    x = 0 Loop Until True\n",
-
-        /* Select...End Select */
-        "x = False\n"
-        "Select Case 42\n"
-        "    Case 0\n"
-        "        Call ok(False, \"unexpected case\")\n"
-        "    Case 42\n"
-        "        x = True End Select\n"
-        "Call ok(x, \"wrong case\")\n",
-
-        /* Class...End Class  (empty) */
-        "Class C End Class",
-
-        /* invalid use of parentheses for call statement */
-        "strcomp(\"x\", \"y\")"
+        {
+            /* If...End If */
+            "If 0 > 1 Then\n"
+            "    x = 0 End If\n",
+            1, 10
+        },
+        {
+            /* While...End While */
+            "While False\n"
+            "    x = 0 End While\n",
+            1, 10
+        },
+        {
+            /* While...Wend */
+            "While False\n"
+            "    x = 0 Wend\n",
+            1, 10
+        },
+        {
+            /* Do While...Loop */
+            "Do While False\n"
+            "    x = 0 Loop\n",
+            1, 10
+        },
+        {
+            /* Do Until...Loop */
+            "Do Until True\n"
+            "    x = 0 Loop\n",
+            1, 10
+        },
+        {
+            /* Do...Loop While */
+            "Do\n"
+            "    x = 0 Loop While False\n",
+            1, 10
+        },
+        {
+            /* Do...Loop Until */
+            "Do\n"
+            "    x = 0 Loop Until True\n",
+            1, 10
+        },
+        {
+            /* Select...End Select */
+            "x = False\n"
+            "Select Case 42\n"
+            "    Case 0\n"
+            "        Call ok(False, \"unexpected case\")\n"
+            "    Case 42\n"
+            "        x = True End Select\n"
+            "Call ok(x, \"wrong case\")\n",
+            5, 17
+        },
+        {
+            /* Class...End Class  (empty) */
+            "Class C End Class",
+            0, 8
+        },
+        {
+            /* Class...End Class  (empty) */
+            "Class C _\nEnd Class",
+            1, 0
+        },
+        {
+            /* invalid use of parentheses for call statement */
+            "strcomp(\"x\", \"y\")",
+            0, -17
+        },
+        {
+            "\n\n\n  cint _\n   throwInt(&h80001234&)",
+            3, 2
+        },
+        {
+            "dim x\n"
+            "if true then throwInt(&h80001234&)",
+            1, 13
+        },
+        {
+            "dim x\n"
+            "if x = throwInt(&h80001234&) then x = 1",
+            1, 0
+        },
+        {
+            "sub test\n"
+            "    dim x\n"
+            "    if x = throwInt(&h80001234&) then x = 1\n"
+            "end sub\n"
+            "test\n",
+            2, 4
+        },
+        {
+            "dim x\n"
+            "do\n"
+            "    x = 1\n"
+            "loop until throwInt(&h80001234&)\n",
+            3, 0
+        },
+        {
+            "\n  select case 3\n"
+            "    case 2\n"
+            "        ok false, \"unexpected case\"\n"
+            "    case throwInt(&h80001234&)\n"
+            "        throwInt &h87001234&\n"
+            "end select\n",
+            1, 2
+        },
+        {
+            "if false then\n"
+            "    ok false, \"unexpected case\"\n"
+            " elseif throwInt(&h80001234&) then\n"
+            "    throwInt &h87001234&\n"
+            "else\n"
+            "    throwInt &h87001234&\n"
+            "end if\n",
+            2, 1
+        }
     };
     HRESULT hres;
     UINT i;
 
     for (i = 0; i < ARRAY_SIZE(invalid_scripts); i++)
     {
+        error_line = ~0;
+        error_char = -1;
+        onerror_hres = S_OK;
+
         SET_EXPECT(OnScriptError);
-        hres = parse_script_ar(invalid_scripts[i]);
-        ok(FAILED(hres), "[%u] script did not fail\n", i);
+        hres = parse_script_ar(invalid_scripts[i].src);
+        ok(hres == SCRIPT_E_REPORTED, "[%u] script returned: %08x\n", i, hres);
         CHECK_CALLED(OnScriptError);
+
+        todo_wine_if(invalid_scripts[i].error_line)
+        ok(error_line == invalid_scripts[i].error_line, "[%u] error line %u expected %u\n",
+           i, error_line, invalid_scripts[i].error_line);
+        todo_wine_if(invalid_scripts[i].error_char)
+        ok(error_char == abs(invalid_scripts[i].error_char), "[%u] error char %d expected %d\n",
+           i, error_char, invalid_scripts[i].error_char);
     }
 }
 




More information about the wine-cvs mailing list