[JSCRIPT_WINETEST] Sync with Wine Staging 1.7.37. CORE-9246

svn path=/trunk/; revision=66878
This commit is contained in:
Amine Khaldi 2015-03-25 15:58:33 +00:00
parent ff44482672
commit 27db0e5449
3 changed files with 530 additions and 11 deletions

View file

@ -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();

View file

@ -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);

View file

@ -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;
}