[JSCRIPT_WINETEST]
[reactos.git] / rostests / winetests / jscript / run.c
index e6209ad..f0dfd79 100644 (file)
@@ -1163,7 +1163,7 @@ static HRESULT WINAPI Global_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid,
         return S_OK;
 
     case DISPID_GLOBAL_TESTARGTYPES: {
-        VARIANT args[3];
+        VARIANT args[4];
         DISPPARAMS dp = {args, NULL, sizeof(args)/sizeof(*args), 0};
         HRESULT hres;
 
@@ -1197,6 +1197,8 @@ static HRESULT WINAPI Global_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid,
         V_INT(args+1) = 22;
         V_VT(args+2) = VT_UNKNOWN;
         V_UNKNOWN(args+2) = (IUnknown*)&testObj;
+        V_VT(args+3) = VT_UNKNOWN;
+        V_UNKNOWN(args+3) = NULL;
         hres = IDispatch_Invoke(V_DISPATCH(pdp->rgvarg), DISPID_VALUE, &IID_NULL, 0, DISPATCH_METHOD, &dp, NULL, NULL, NULL);
         ok(hres == S_OK, "Invoke failed: %08x\n", hres);
 
@@ -1746,7 +1748,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());
@@ -1784,13 +1786,12 @@ static void run_from_file(const char *filename)
     ok(hres == S_OK, "parse_script failed: %08x\n", hres);
 }
 
-static void run_from_res(const char *name)
+static BSTR load_res(const char *name)
 {
     const char *data;
     DWORD size, len;
     BSTR str;
     HRSRC src;
-    HRESULT hres;
 
     strict_dispid_check = FALSE;
     test_name = name;
@@ -1805,6 +1806,16 @@ static void run_from_res(const char *name)
     str = SysAllocStringLen(NULL, len);
     MultiByteToWideChar(CP_ACP, 0, data, size, str, len);
 
+    return str;
+}
+
+static void run_from_res(const char *name)
+{
+    BSTR str;
+    HRESULT hres;
+
+    str = load_res(name);
+
     SET_EXPECT(global_success_d);
     SET_EXPECT(global_success_i);
     hres = parse_script(SCRIPTITEM_GLOBALMEMBERS, str);
@@ -2138,10 +2149,12 @@ static BOOL run_tests(void)
     CHECK_CALLED(global_propargput_i);
 
     SET_EXPECT(global_testargtypes_i);
-    parse_script_a("testArgTypes(dispUnk, intProp(), intProp, getShort(), shortProp, function(d,i,s) {"
+    parse_script_a("testArgTypes(dispUnk, intProp(), intProp, getShort(), shortProp, function(nullunk,d,i,s) {"
                    "    ok(getVT(i) === 'VT_I4', 'getVT(i) = ' + getVT(i));"
                    "    ok(getVT(s) === 'VT_I4', 'getVT(s) = ' + getVT(s));"
                    "    ok(getVT(d) === 'VT_DISPATCH', 'getVT(d) = ' + getVT(d));"
+                   "    ok(getVT(nullunk) === 'VT_DISPATCH', 'getVT(nullunk) = ' + getVT(nullunk));"
+                   "    ok(nullunk === null, 'nullunk !== null');"
                    "});");
     CHECK_CALLED(global_testargtypes_i);
 
@@ -2311,6 +2324,61 @@ static void run_encoded_tests(void)
     ok(hres == JS_E_INVALID_CHAR, "parse_script failed %08x\n", hres);
 }
 
+static void run_benchmark(const char *script_name)
+{
+    IActiveScriptParse *parser;
+    IActiveScript *engine;
+    ULONG start, end;
+    BSTR src;
+    HRESULT hres;
+
+    engine = create_script();
+    if(!engine)
+        return;
+
+    hres = IActiveScript_QueryInterface(engine, &IID_IActiveScriptParse, (void**)&parser);
+    ok(hres == S_OK, "Could not get IActiveScriptParse: %08x\n", hres);
+    if (FAILED(hres)) {
+        IActiveScript_Release(engine);
+        return;
+    }
+
+    hres = IActiveScriptParse_InitNew(parser);
+    ok(hres == S_OK, "InitNew failed: %08x\n", hres);
+
+    hres = IActiveScript_SetScriptSite(engine, &ActiveScriptSite);
+    ok(hres == S_OK, "SetScriptSite failed: %08x\n", hres);
+
+    hres = IActiveScript_AddNamedItem(engine, testW,
+            SCRIPTITEM_ISVISIBLE|SCRIPTITEM_ISSOURCE);
+    ok(hres == S_OK, "AddNamedItem failed: %08x\n", hres);
+
+    hres = IActiveScript_SetScriptState(engine, SCRIPTSTATE_STARTED);
+    ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_STARTED) failed: %08x\n", hres);
+
+    src = load_res(script_name);
+
+    start = GetTickCount();
+    hres = IActiveScriptParse_ParseScriptText(parser, src, NULL, NULL, NULL, 0, 0, 0, NULL, NULL);
+    end = GetTickCount();
+    ok(hres == S_OK, "%s: ParseScriptText failed: %08x\n", script_name, hres);
+
+    trace("%s ran in %u ms\n", script_name, end-start);
+
+    IActiveScript_Release(engine);
+    IActiveScriptParse_Release(parser);
+    SysFreeString(src);
+}
+
+static void run_benchmarks(void)
+{
+    trace("Running benchmarks...\n");
+
+    run_benchmark("dna.js");
+    run_benchmark("base64.js");
+    run_benchmark("validateinput.js");
+}
+
 static BOOL check_jscript(void)
 {
     IActiveScriptProperty *script_prop;
@@ -2357,6 +2425,9 @@ START_TEST(run)
             trace("ParseProcedureText tests...\n");
             test_parse_proc();
         }
+
+        if(winetest_interactive)
+            run_benchmarks();
     }
 
     CoUninitialize();