diff --git a/rostests/winetests/jscript/cc.js b/rostests/winetests/jscript/cc.js index 1fee93fc694..8f45a3dd331 100644 --- a/rostests/winetests/jscript/cc.js +++ b/rostests/winetests/jscript/cc.js @@ -72,4 +72,241 @@ try { } ok(tmp, "expected syntax exception"); +ok(isNaN(@test), "@test = " + @test); + +@set @test = 1 +ok(@test === 1, "@test = " + @test); + +@set @test = 0 +ok(@test === 0, "@test = " + @test); + +tmp = false +@set @test = @test tmp=true +ok(@test === 0, "@test = " + @test); +ok(tmp, "expr after @set not evaluated"); + +@set @test = !@test +ok(@test === true, "@test = " + @test); + +@set @test = (@test+1+true) +ok(@test === 3, "@test = " + @test); + +@set + @test + = + 2 +ok(@test === 2, "@test = " + @test); + +@set + @test + = + ( + 2 + + + 2 + ) +ok(@test === 4, "@test = " + @test); + +@set @test = 2.5 +ok(@test === 2.5, "@test = " + @test); + +@set @test = 0x4 +ok(@test === 4, "@test = " + @test); + +@set @test = (2 + 2/2) +ok(@test === 3, "@test = " + @test); + +@set @test = (false+false) +ok(@test === 0, "@test = " + @test); + +@set @test = ((1+1)*((3)+1)) +ok(@test === 8, "@test = " + @test); + +@set @_test = true +ok(@_test === true, "@_test = " + @_test); + +@set @$test = true +ok(@$test === true, "@$test = " + @$test); + +@set @newtest = (@newtest != @newtest) +ok(@newtest === true, "@newtest = " + @newtest); + +@set @test = (false != 0) +ok(@test === false, "@test = " + @test); + +@set @test = (1 != true) +ok(@test === false, "@test = " + @test); + +@set @test = (0 != true) +ok(@test === true, "@test = " + @test); + +@set @test = (true-2) +ok(@test === -1, "@test = " + @test); + +@set @test = (true-@_jscript) +ok(@test === 0, "@test = " + @test); + +@set @test = (true==1) +ok(@test === true, "@test = " + @test); + +@set @test = (1==false+1) +ok(@test === true, "@test = " + @test); + +function expect(val, exval) { + ok(val === exval, "got " + val + " expected " + exval); +} + +@set @test = (false < 0.5) +expect(@test, true); + +@set @test = (true == 0 < 0.5) +expect(@test, true); + +@set @test = (false < 0) +expect(@test, false); + +@set @test = (false > 0.5) +expect(@test, false); + +@set @test = (1 < true) +expect(@test, false); + +@set @test = (1 <= true) +expect(@test, true); + +@set @test = (1 >= true) +expect(@test, true); + +@set @test = (1 >= true-1) +expect(@test, true); + +@if (false) + this wouldn not parse +"@end + +@if (false) "@end + +tmp = "@if (false) @end"; +ok(tmp.length === 16, "tmp.length = " + tmp.length); + +@if(true) +tmp = true +@end +ok(tmp === true, "tmp = " + tmp); + +@if(false) +@if this would not CC parse +this will not parse +@elif(true) +this will also not parse +@else +this also will not parse +@if let me complicate things a bit +@end enough +@end +@end + +@if(false) +this will not parse +@else +tmp = 2 +@else +this will not be parsed +@else +also this +@end +ok(tmp === 2, "tmp = " + tmp); + +@if(true) +tmp = 3; +@else +just skip this +@end +ok(tmp === 3, "tmp = " + tmp); + +@if(true) +tmp = 4; +@elif(true) +this will not parse +@elif nor this +@else +just skip this +@end +ok(tmp === 4, "tmp = " + tmp); + +@if(false) +this will not parse +@elif(false) +nor this would +@elif(true) +tmp = 5; +@elif nor this +@else +just skip this +@end +ok(tmp === 5, "tmp = " + tmp); + +@if (!@_jscript) +this would not parse +@if(true) +@else +@if(false) +@end +@end +@elif (@_jscript) +tmp = 6; +@elif (true) +@if xxx +@else +@if @elif @elif @else @end +@end +@else +this would not parse +@end +ok(tmp === 6, "tmp = " + tmp); + +@if(true) +@if(false) +@else +tmp = 7; +@end +@else +this would not parse +@end +ok(tmp === 7, "tmp = " + tmp); + +var exception_map = { + JS_E_SYNTAX: {type: "SyntaxError", number: -2146827286}, + JS_E_MISSING_LBRACKET: {type: "SyntaxError", number: -2146827283}, + JS_E_EXPECTED_IDENTIFIER: {type: "SyntaxError", number: -2146827278}, + JS_E_EXPECTED_ASSIGN: {type: "SyntaxError", number: -2146827277}, + JS_E_EXPECTED_CCEND: {type: "SyntaxError", number: -2146827259}, + JS_E_EXPECTED_AT: {type: "SyntaxError", number: -2146827256} +}; + +function testException(src, id) { + var ex = exception_map[id]; + var ret = "", num = ""; + + try { + eval(src); + } catch(e) { + ret = e.name; + num = e.number; + } + + ok(ret === ex.type, "Exception test, ret = " + ret + ", expected " + ex.type +". Executed code: " + src); + ok(num === ex.number, "Exception test, num = " + num + ", expected " + ex.number + ". Executed function: " + src); +} + +testException("@set test=true", "JS_E_EXPECTED_AT"); +testException("@set @1=true", "JS_E_EXPECTED_IDENTIFIER"); +testException("@set @test x=true", "JS_E_EXPECTED_ASSIGN"); +testException("@if false\n@end", "JS_E_MISSING_LBRACKET"); +testException("@if (false)\n", "JS_E_EXPECTED_CCEND"); +testException("@end\n", "JS_E_SYNTAX"); +testException("@elif\n", "JS_E_SYNTAX"); +testException("@else\n", "JS_E_SYNTAX"); +testException("@if false\n@elif true\n@end", "JS_E_MISSING_LBRACKET"); + reportSuccess(); diff --git a/rostests/winetests/jscript/lang.js b/rostests/winetests/jscript/lang.js index ccbdb5182ae..3e60aba76ad 100644 --- a/rostests/winetests/jscript/lang.js +++ b/rostests/winetests/jscript/lang.js @@ -1450,6 +1450,24 @@ function returnTest() { ok(returnTest() === undefined, "returnTest = " + returnTest()); +ActiveXObject = 1; +ok(ActiveXObject === 1, "ActiveXObject = " + ActiveXObject); + +Boolean = 1; +ok(Boolean === 1, "Boolean = " + Boolean); + +Object = 1; +ok(Object === 1, "Object = " + Object); + +Array = 1; +ok(Array === 1, "Array = " + Array); + +Date = 1; +ok(Date === 1, "Date = " + Date); + +Error = 1; +ok(Error === 1, "Error = " + Error); + /* Keep this test in the end of file */ undefined = 6; ok(undefined === 6, "undefined = " + undefined); diff --git a/rostests/winetests/jscript/run.c b/rostests/winetests/jscript/run.c index dba47411e23..82776fa2ea0 100644 --- a/rostests/winetests/jscript/run.c +++ b/rostests/winetests/jscript/run.c @@ -87,6 +87,8 @@ DEFINE_EXPECT(global_propget_d); DEFINE_EXPECT(global_propget_i); DEFINE_EXPECT(global_propput_d); DEFINE_EXPECT(global_propput_i); +DEFINE_EXPECT(global_propputref_d); +DEFINE_EXPECT(global_propputref_i); DEFINE_EXPECT(global_propdelete_d); DEFINE_EXPECT(global_nopropdelete_d); DEFINE_EXPECT(global_success_d); @@ -143,6 +145,8 @@ DEFINE_EXPECT(DeleteMemberByDispID_false); #define DISPID_GLOBAL_TESTRES 0x1018 #define DISPID_GLOBAL_TESTNORES 0x1019 #define DISPID_GLOBAL_DISPEXFUNC 0x101a +#define DISPID_GLOBAL_TESTPROPPUTREF 0x101b +#define DISPID_GLOBAL_GETSCRIPTSTATE 0x101c #define DISPID_GLOBAL_TESTPROPDELETE 0x2000 #define DISPID_GLOBAL_TESTNOPROPDELETE 0x2001 @@ -151,6 +155,7 @@ DEFINE_EXPECT(DeleteMemberByDispID_false); #define DISPID_TESTOBJ_ONLYDISPID 0x2001 #define DISPID_TESTOBJ_WITHPROP 0x2002 +#define JS_E_OUT_OF_MEMORY 0x800a03ec #define JS_E_INVALID_CHAR 0x800a03f6 static const WCHAR testW[] = {'t','e','s','t',0}; @@ -164,6 +169,7 @@ static const char *test_name = "(null)"; static IDispatch *script_disp; static int invoke_version; static IActiveScriptError *script_error; +static IActiveScript *script_engine; static const CLSID *engine_clsid = &CLSID_JScript; /* Returns true if the user interface is in English. Note that this does not @@ -614,6 +620,12 @@ static HRESULT WINAPI Global_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD *pid = DISPID_GLOBAL_TESTPROPPUT; return S_OK; } + if(!strcmp_wa(bstrName, "testPropPutRef")) { + CHECK_EXPECT(global_propputref_d); + test_grfdex(grfdex, fdexNameCaseSensitive); + *pid = DISPID_GLOBAL_TESTPROPPUTREF; + return S_OK; + } if(!strcmp_wa(bstrName, "testPropDelete")) { CHECK_EXPECT(global_propdelete_d); test_grfdex(grfdex, fdexNameCaseSensitive); @@ -753,6 +765,11 @@ static HRESULT WINAPI Global_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD return S_OK; } + if(!strcmp_wa(bstrName, "getScriptState")) { + *pid = DISPID_GLOBAL_GETSCRIPTSTATE; + return S_OK; + } + if(strict_dispid_check && strcmp_wa(bstrName, "t")) ok(0, "unexpected call %s\n", wine_dbgstr_w(bstrName)); return DISP_E_UNKNOWNNAME; @@ -847,6 +864,21 @@ static HRESULT WINAPI Global_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, ok(V_I4(pdp->rgvarg) == 1, "V_I4(pdp->rgvarg)=%d\n", V_I4(pdp->rgvarg)); return S_OK; + case DISPID_GLOBAL_TESTPROPPUTREF: + CHECK_EXPECT(global_propputref_i); + + ok(wFlags == (INVOKE_PROPERTYPUT|INVOKE_PROPERTYPUTREF), "wFlags = %x\n", wFlags); + ok(pdp != NULL, "pdp == NULL\n"); + ok(pdp->rgvarg != NULL, "rgvarg == NULL\n"); + ok(pdp->rgdispidNamedArgs != NULL, "rgdispidNamedArgs == NULL\n"); + ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs); + ok(pdp->cNamedArgs == 1, "cNamedArgs = %d\n", pdp->cNamedArgs); + ok(pdp->rgdispidNamedArgs[0] == DISPID_PROPERTYPUT, "pdp->rgdispidNamedArgs[0] = %d\n", pdp->rgdispidNamedArgs[0]); + ok(!pvarRes, "pvarRes != NULL\n"); + + ok(V_VT(pdp->rgvarg) == VT_DISPATCH, "V_VT(pdp->rgvarg)=%d\n", V_VT(pdp->rgvarg)); + return S_OK; + case DISPID_GLOBAL_GETVT: ok(pdp != NULL, "pdp == NULL\n"); ok(pdp->rgvarg != NULL, "rgvarg == NULL\n"); @@ -1090,6 +1122,18 @@ static HRESULT WINAPI Global_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, return S_OK; + case DISPID_GLOBAL_GETSCRIPTSTATE: { + SCRIPTSTATE state; + HRESULT hres; + + hres = IActiveScript_GetScriptState(script_engine, &state); + ok(hres == S_OK, "GetScriptState failed: %08x\n", hres); + + V_VT(pvarRes) = VT_I4; + V_I4(pvarRes) = state; + return S_OK; + } + case DISPID_GLOBAL_PROPARGPUT: CHECK_EXPECT(global_propargput_i); ok(wFlags == INVOKE_PROPERTYPUT, "wFlags = %x\n", wFlags); @@ -1174,7 +1218,7 @@ static HRESULT WINAPI Global_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, return S_OK; case DISPID_GLOBAL_TESTARGTYPES: { - VARIANT args[4]; + VARIANT args[6], v; DISPPARAMS dp = {args, NULL, sizeof(args)/sizeof(*args), 0}; HRESULT hres; @@ -1210,6 +1254,12 @@ static HRESULT WINAPI Global_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, V_UNKNOWN(args+2) = (IUnknown*)&testObj; V_VT(args+3) = VT_UNKNOWN; V_UNKNOWN(args+3) = NULL; + V_VT(args+4) = VT_UI4; + V_UI4(args+4) = 0xffffffff; + V_VT(args+5) = VT_BYREF|VT_VARIANT; + V_VARIANTREF(args+5) = &v; + V_VT(&v) = VT_I4; + V_I4(&v) = 2; 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); @@ -1890,7 +1940,48 @@ static void test_isvisible(BOOL global_members) IActiveScriptParse_Release(parser); } -static HRESULT parse_script_expr(const char *expr, VARIANT *res) +static void test_start(void) +{ + IActiveScriptParse *parser; + IActiveScript *engine; + BSTR str; + HRESULT hres; + + script_engine = 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); + + 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|SCRIPTITEM_GLOBALMEMBERS); + ok(hres == S_OK, "AddNamedItem failed: %08x\n", hres); + + str = a2bstr("ok(getScriptState() === 5, \"getScriptState = \" + getScriptState());\n" + "reportSuccess();"); + hres = IActiveScriptParse_ParseScriptText(parser, str, NULL, NULL, NULL, 0, 0, 0, NULL, NULL); + ok(hres == S_OK, "ParseScriptText failed: %08x\n", hres); + SysFreeString(str); + + SET_EXPECT(global_success_d); + SET_EXPECT(global_success_i); + hres = IActiveScript_SetScriptState(engine, SCRIPTSTATE_STARTED); + ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_STARTED) failed: %08x\n", hres); + CHECK_CALLED(global_success_d); + CHECK_CALLED(global_success_i); + + IActiveScript_Release(engine); + IActiveScriptParse_Release(parser); + script_engine = NULL; +} + +static HRESULT parse_script_expr(const char *expr, VARIANT *res, IActiveScript **engine_ret) { IActiveScriptParse *parser; IActiveScript *engine; @@ -1921,12 +2012,41 @@ static HRESULT parse_script_expr(const char *expr, VARIANT *res) hres = IActiveScriptParse_ParseScriptText(parser, str, NULL, NULL, NULL, 0, 0, SCRIPTTEXT_ISEXPRESSION, res, NULL); SysFreeString(str); - IActiveScript_Release(engine); IActiveScriptParse_Release(parser); + if(engine_ret) { + *engine_ret = engine; + }else { + IActiveScript_Close(engine); + IActiveScript_Release(engine); + } return hres; } +static void test_default_value(void) +{ + DISPPARAMS dp = {0}; + IDispatch *disp; + VARIANT v; + HRESULT hres; + + hres = parse_script_expr("new Date()", &v, NULL); + ok(hres == S_OK, "parse_script_expr failed: %08x\n", hres); + ok(V_VT(&v) == VT_DISPATCH, "V_VT(v) = %d\n", V_VT(&v)); + disp = V_DISPATCH(&v); + + V_VT(&v) = VT_EMPTY; + hres = IDispatch_Invoke(disp, DISPID_VALUE, &IID_NULL, 0, DISPATCH_PROPERTYGET, &dp, &v, NULL, NULL); + ok(hres == S_OK || broken(hres == 0x8000ffff), "Invoke failed: %08x\n", hres); + if(hres == S_OK) + { + ok(V_VT(&v) == VT_BSTR, "V_VT(v) = %d\n", V_VT(&v)); + } + + VariantClear(&v); + IDispatch_Release(disp); +} + static void test_script_exprs(void) { VARIANT v; @@ -1934,45 +2054,155 @@ static void test_script_exprs(void) testing_expr = TRUE; - hres = parse_script_expr("true", &v); + hres = parse_script_expr("true", &v, NULL); ok(hres == S_OK, "parse_script_expr failed: %08x\n", hres); ok(V_VT(&v) == VT_BOOL, "V_VT(v) = %d\n", V_VT(&v)); ok(V_BOOL(&v) == VARIANT_TRUE, "V_BOOL(v) = %x\n", V_BOOL(&v)); - hres = parse_script_expr("false, true", &v); + hres = parse_script_expr("false, true", &v, NULL); ok(hres == S_OK, "parse_script_expr failed: %08x\n", hres); ok(V_VT(&v) == VT_BOOL, "V_VT(v) = %d\n", V_VT(&v)); ok(V_BOOL(&v) == VARIANT_TRUE, "V_BOOL(v) = %x\n", V_BOOL(&v)); SET_EXPECT(global_success_d); SET_EXPECT(global_success_i); - hres = parse_script_expr("reportSuccess(); true", &v); + hres = parse_script_expr("reportSuccess(); true", &v, NULL); ok(hres == S_OK, "parse_script_expr failed: %08x\n", hres); ok(V_VT(&v) == VT_BOOL, "V_VT(v) = %d\n", V_VT(&v)); ok(V_BOOL(&v) == VARIANT_TRUE, "V_BOOL(v) = %x\n", V_BOOL(&v)); CHECK_CALLED(global_success_d); CHECK_CALLED(global_success_i); - hres = parse_script_expr("if(false) true", &v); + hres = parse_script_expr("if(false) true", &v, NULL); ok(hres == S_OK, "parse_script_expr failed: %08x\n", hres); ok(V_VT(&v) == VT_EMPTY, "V_VT(v) = %d\n", V_VT(&v)); - hres = parse_script_expr("return testPropGet", &v); + hres = parse_script_expr("return testPropGet", &v, NULL); ok(hres == 0x800a03fa, "parse_script_expr failed: %08x\n", hres); - hres = parse_script_expr("reportSuccess(); return true", &v); + hres = parse_script_expr("reportSuccess(); return true", &v, NULL); ok(hres == 0x800a03fa, "parse_script_expr failed: %08x\n", hres); SET_EXPECT(global_success_d); SET_EXPECT(global_success_i); - hres = parse_script_expr("reportSuccess(); true", NULL); + hres = parse_script_expr("reportSuccess(); true", NULL, NULL); ok(hres == S_OK, "parse_script_expr failed: %08x\n", hres); CHECK_CALLED(global_success_d); CHECK_CALLED(global_success_i); + test_default_value(); + testing_expr = FALSE; } +static void test_invokeex(void) +{ + DISPID func_id, prop_id; + DISPPARAMS dp = {NULL}; + IActiveScript *script; + IDispatchEx *dispex; + VARIANT v; + BSTR str; + HRESULT hres; + + hres = parse_script_expr("var o = {func: function() {return 3;}, prop: 6}; o", &v, &script); + ok(hres == S_OK, "parse_script_expr failed: %08x\n", hres); + ok(V_VT(&v) == VT_DISPATCH, "V_VT(v) = %d\n", V_VT(&v)); + + hres = IDispatch_QueryInterface(V_DISPATCH(&v), &IID_IDispatchEx, (void**)&dispex); + ok(hres == S_OK, "Could not get IDispatchEx iface: %08x\n", hres); + VariantClear(&v); + + str = a2bstr("func"); + hres = IDispatchEx_GetDispID(dispex, str, 0, &func_id); + SysFreeString(str); + ok(hres == S_OK, "GetDispID failed: %08x\n", hres); + + str = a2bstr("prop"); + hres = IDispatchEx_GetDispID(dispex, str, 0, &prop_id); + SysFreeString(str); + ok(hres == S_OK, "GetDispID failed: %08x\n", hres); + + hres = IDispatchEx_InvokeEx(dispex, func_id, 0, DISPATCH_METHOD, &dp, &v, NULL, NULL); + ok(hres == S_OK, "InvokeEx failed: %08x\n", hres); + ok(V_VT(&v) == VT_I4, "V_VT(v) = %d\n", V_VT(&v)); + ok(V_I4(&v) == 3, "V_I4(v) = %d\n", V_I4(&v)); + + hres = IDispatchEx_InvokeEx(dispex, prop_id, 0, DISPATCH_PROPERTYGET, &dp, &v, NULL, NULL); + ok(hres == S_OK, "InvokeEx failed: %08x\n", hres); + ok(V_VT(&v) == VT_I4, "V_VT(v) = %d\n", V_VT(&v)); + ok(V_I4(&v) == 6, "V_I4(v) = %d\n", V_I4(&v)); + + hres = IActiveScript_SetScriptState(script, SCRIPTSTATE_UNINITIALIZED); + ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_STARTED) failed: %08x\n", hres); + + str = a2bstr("func"); + hres = IDispatchEx_GetDispID(dispex, str, 0, &func_id); + SysFreeString(str); + ok(hres == S_OK, "GetDispID failed: %08x\n", hres); + + hres = IDispatchEx_InvokeEx(dispex, func_id, 0, DISPATCH_METHOD, &dp, &v, NULL, NULL); + ok(hres == E_UNEXPECTED || broken(hres == 0x800a1393), "InvokeEx failed: %08x\n", hres); + + hres = IDispatchEx_InvokeEx(dispex, prop_id, 0, DISPATCH_PROPERTYGET, &dp, &v, NULL, NULL); + ok(hres == S_OK, "InvokeEx failed: %08x\n", hres); + ok(V_VT(&v) == VT_I4, "V_VT(v) = %d\n", V_VT(&v)); + ok(V_I4(&v) == 6, "V_I4(v) = %d\n", V_I4(&v)); + + IDispatchEx_Release(dispex); + IActiveScript_Release(script); +} + +struct bom_test +{ + WCHAR str[1024]; + HRESULT hres; +}; + +static void run_bom_tests(void) +{ + BSTR src; + int i; + HRESULT hres; + struct bom_test bom_tests[] = { + {{'v','a','r',' ','a',' ','=',' ','1',';',' ','r','e','p','o','r','t','S','u','c','c','e','s','s','(',')',';','\0'}, S_OK}, + {{0xFEFF,'v','a','r',' ','a',' ','=',' ','1',';',' ','r','e','p','o','r','t','S','u','c','c','e','s','s','(',')',';','\0'}, S_OK}, + {{'v',0xFEFF,'a','r',' ','a',' ','=',' ','1',';',' ','r','e','p','o','r','t','S','u','c','c','e','s','s','(',')',';','\0'}, JS_E_OUT_OF_MEMORY}, + {{'v','a','r',0xFEFF,' ','a',' ','=',' ','1',';',' ','r','e','p','o','r','t','S','u','c','c','e','s','s','(',')',';','\0'}, S_OK}, + {{'v','a','r',' ','a',' ','=',' ','1',';',' ',0xFEFF,'r','e','p','o','r','t','S','u','c','c','e','s','s','(',')',';','\0'}, S_OK}, + {{'v','a','r',' ','a',' ','=',' ','1',';',' ','r','e','p','o','r','t',0xFEFF,'S','u','c','c','e','s','s','(',')',';','\0'}, JS_E_OUT_OF_MEMORY}, + {{'v','a','r',' ','a',' ','=',' ','1',';',' ','r','e','p','o','r','t','S','u','c','c','e','s','s',0xFEFF,'(',')',';','\0'}, S_OK}, + {{'v','a','r',' ','a',' ','=',' ','1',';',' ','r','e','p','o','r','t','S','u','c','c','e','s','s','(',0xFEFF,')',';','\0'}, S_OK}, + {{'v','a','r',' ','a',' ','=',0xFEFF,' ','1',';',' ','r','e','p','o','r','t','S','u','c','c','e','s','s','(',0xFEFF,')',';','\0'}, S_OK}, + {{0xFEFF,'v','a','r',' ','a',' ','=',0xFEFF,0xFEFF,' ','1',';',' ','r','e','p','o','r','t','S','u','c','c','e','s','s','(',0xFEFF,')',';','\0'}, S_OK}, + {{0}} + }; + + engine_clsid = &CLSID_JScript; + + for (i = 0; bom_tests[i].str[0]; i++) + { + if(bom_tests[i].hres == S_OK) + { + SET_EXPECT(global_success_d); + SET_EXPECT(global_success_i); + src = SysAllocString(bom_tests[i].str); + hres = parse_script(SCRIPTITEM_GLOBALMEMBERS, src); + ok(hres == S_OK, "test %s failed with %08x\n", wine_dbgstr_w(src), hres); + SysFreeString(src); + CHECK_CALLED(global_success_d); + CHECK_CALLED(global_success_i); + } + else + { + src = SysAllocString(bom_tests[i].str); + hres = parse_script(SCRIPTITEM_GLOBALMEMBERS, src); + todo_wine ok(hres == bom_tests[i].hres, "test %s returned with %08x\n", wine_dbgstr_w(src), hres); + SysFreeString(src); + } + } +} + static BOOL run_tests(void) { HRESULT hres; @@ -2005,6 +2235,18 @@ static BOOL run_tests(void) CHECK_CALLED(global_propput_d); CHECK_CALLED(global_propput_i); + SET_EXPECT(global_propputref_d); + SET_EXPECT(global_propputref_i); + parse_script_a("testPropPutRef = new Object();"); + CHECK_CALLED(global_propputref_d); + CHECK_CALLED(global_propputref_i); + + SET_EXPECT(global_propputref_d); + SET_EXPECT(global_propputref_i); + parse_script_a("testPropPutRef = testObj;"); + CHECK_CALLED(global_propputref_d); + CHECK_CALLED(global_propputref_i); + SET_EXPECT(global_success_d); SET_EXPECT(global_success_i); parse_script_a("reportSuccess();"); @@ -2143,6 +2385,12 @@ static BOOL run_tests(void) CHECK_CALLED(global_propget_d); CHECK_CALLED(global_propget_i); + SET_EXPECT(global_propputref_d); + SET_EXPECT(global_propputref_i); + parse_script_a("testPropPutRef = nullDisp;"); + CHECK_CALLED(global_propputref_d); + CHECK_CALLED(global_propputref_i); + SET_EXPECT(global_propget_d); SET_EXPECT(global_propget_i); parse_script_a("(function () { this.testPropGet; })();"); @@ -2175,12 +2423,16 @@ 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(nullunk,d,i,s) {" + parse_script_a("testArgTypes(dispUnk, intProp(), intProp, getShort(), shortProp, function(i4ref,ui4,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');" + " ok(getVT(ui4) === 'VT_R8', 'getVT(ui4) = ' + getVT(ui4));" + " ok(ui4 > 0, 'ui4 = ' + ui4);" + " ok(getVT(i4ref) === 'VT_I4', 'getVT(i4ref) = ' + getVT(i4ref));" + " ok(i4ref === 2, 'i4ref = ' + i4ref);" "});"); CHECK_CALLED(global_testargtypes_i); @@ -2190,6 +2442,14 @@ static BOOL run_tests(void) CHECK_CALLED(testobj_withprop_d); CHECK_CALLED(testobj_withprop_i); + parse_script_a("@set @t=2\nok(@t === 2, '@t = ' + @t);"); + + SET_EXPECT(global_success_d); + SET_EXPECT(global_success_i); + parse_script_a("@if(true)\nif(@_jscript) reportSuccess();\n@end"); + CHECK_CALLED(global_success_d); + CHECK_CALLED(global_success_i); + run_from_res("lang.js"); run_from_res("api.js"); run_from_res("regexp.js"); @@ -2197,6 +2457,7 @@ static BOOL run_tests(void) test_isvisible(FALSE); test_isvisible(TRUE); + test_start(); parse_script_af(0, "test.testThis2(this);"); parse_script_af(0, "(function () { test.testThis2(this); })();"); @@ -2215,6 +2476,7 @@ static BOOL run_tests(void) ok(hres != S_OK, "ParseScriptText have not failed\n"); test_script_exprs(); + test_invokeex(); parse_script_with_error_a( "?", @@ -2258,6 +2520,8 @@ static BOOL run_tests(void) "Object expected", NULL); + run_bom_tests(); + return TRUE; }