[JSCRIPT_WINETEST]

sync jscript_winetest to wine 1.1.39

svn path=/trunk/; revision=45767
This commit is contained in:
Christoph von Wittich 2010-03-02 19:52:22 +00:00
parent 86405be2d6
commit c6658bfc85
8 changed files with 1782 additions and 68 deletions

File diff suppressed because it is too large Load diff

View file

@ -58,6 +58,47 @@ ok(tmp === "undefined", "encodeURI() = " + tmp);
tmp = encodeURI("abc", "test");
ok(tmp === "abc", "encodeURI('abc') = " + tmp);
tmp = encodeURIComponent("abc");
ok(tmp === "abc", "encodeURIComponent('abc') = " + tmp);
dec = decodeURIComponent(tmp);
ok(dec === "abc", "decodeURIComponent('" + tmp + "') = " + dec);
tmp = encodeURIComponent("{abc}");
ok(tmp === "%7Babc%7D", "encodeURIComponent('{abc}') = " + tmp);
dec = decodeURIComponent(tmp);
ok(dec === "{abc}", "decodeURIComponent('" + tmp + "') = " + dec);
tmp = encodeURIComponent("");
ok(tmp === "", "encodeURIComponent('') = " + tmp);
dec = decodeURIComponent(tmp);
ok(dec === "", "decodeURIComponent('" + tmp + "') = " + dec);
tmp = encodeURIComponent("\01\02\03\04");
ok(tmp === "%01%02%03%04", "encodeURIComponent('\\01\\02\\03\\04') = " + tmp);
dec = decodeURIComponent(tmp);
ok(dec === "\01\02\03\04", "decodeURIComponent('" + tmp + "') = " + dec);
tmp = encodeURIComponent("{#@}");
ok(tmp === "%7B%23%40%7D", "encodeURIComponent('{#@}') = " + tmp);
dec = decodeURIComponent(tmp);
ok(dec === "{#@}", "decodeURIComponent('" + tmp + "') = " + dec);
tmp = encodeURIComponent("\xa1 ");
ok(tmp === "%C2%A1%20", "encodeURIComponent(\\xa1 ) = " + tmp);
dec = decodeURIComponent(tmp);
ok(dec === "\xa1 ", "decodeURIComponent('" + tmp + "') = " + dec);
tmp = encodeURIComponent("\xffff");
ok(tmp.length === 8, "encodeURIComponent('\\xffff').length = " + tmp.length);
dec = decodeURIComponent(tmp);
ok(dec === "\xffff", "decodeURIComponent('" + tmp + "') = " + dec);
tmp = encodeURIComponent("abcABC123;/?:@&=+$,-_.!~*'()");
ok(tmp === "abcABC123%3B%2F%3F%3A%40%26%3D%2B%24%2C-_.!~*'()", "encodeURIComponent('abcABC123;/?:@&=+$,-_.!~*'()') = " + tmp);
dec = decodeURIComponent(tmp);
ok(dec === "abcABC123;/?:@&=+$,-_.!~*'()", "decodeURIComponent('" + tmp + "') = " + dec);
tmp = encodeURIComponent();
ok(tmp === "undefined", "encodeURIComponent() = " + tmp);
tmp = encodeURIComponent("abc", "test");
ok(tmp === "abc", "encodeURIComponent('abc') = " + tmp);
dec = decodeURIComponent();
ok(dec === "undefined", "decodeURIComponent() = " + dec);
dec = decodeURIComponent("abc", "test");
ok(dec === "abc", "decodeURIComponent('abc') = " + dec);
tmp = escape("abc");
ok(tmp === "abc", "escape('abc') = " + tmp);
tmp = escape("");
@ -190,6 +231,8 @@ tmp = "abc".charAt(-1);
ok(tmp === "", "'abc',charAt(-1) = " + tmp);
tmp = "abc".charAt(0,2);
ok(tmp === "a", "'abc',charAt(0.2) = " + tmp);
tmp = "abc".charAt(NaN);
ok(tmp === "a", "'abc',charAt(NaN) = " + tmp);
tmp = "abc".charCodeAt(0);
ok(tmp === 0x61, "'abc'.charCodeAt(0) = " + tmp);
@ -575,6 +618,12 @@ ok(arr.push(true, 'b', false) === 10, "arr.push(true, 'b', false) !== 10");
ok(arr[8] === "b", "arr[8] != 'b'");
ok(arr.length === 10, "arr.length != 10");
arr.pop = Array.prototype.pop;
ok(arr.pop() === false, "arr.pop() !== false");
ok(arr[8] === "b", "arr[8] !== 'b'");
ok(arr.pop() === 'b', "arr.pop() !== 'b'");
ok(arr[8] === undefined, "arr[8] !== undefined");
arr = [3,4,5];
tmp = arr.pop();
ok(arr.length === 2, "arr.length = " + arr.length);
@ -590,6 +639,11 @@ for(tmp in arr)
tmp = arr.pop();
ok(arr.length === 0, "arr.length = " + arr.length);
ok(tmp === undefined, "tmp = " + tmp);
arr = new Object();
arr.pop = Array.prototype.pop;
tmp = arr.pop();
ok(arr.length === 0, "arr.length = " + arr.length);
ok(tmp === undefined, "tmp = " + tmp);
arr = [,,,,,];
tmp = arr.pop();
ok(arr.length === 5, "arr.length = " + arr.length);
@ -611,6 +665,16 @@ ok(tmp === "1,2,,false,,,a", "arr.toString() = " + tmp);
tmp = arr.toString("test");
ok(tmp === "1,2,,false,,,a", "arr.toString() = " + tmp);
arr = new Object();
arr.length = 3;
arr[0] = "aa";
arr[2] = 2;
arr[7] = 3;
arr.join = Array.prototype.join;
tmp = arr.join(",");
ok(arr.length === 3, "arr.length = " + arr.length);
ok(tmp === "aa,,2", "tmp = " + tmp);
arr = [5,true,2,-1,3,false,"2.5"];
tmp = arr.sort(function(x,y) { return y-x; });
ok(tmp === arr, "tmp !== arr");
@ -631,6 +695,15 @@ ok(arr.sort() === arr, "arr.sort() !== arr");
for(var i=0; i < arr.length; i++)
ok(arr[i] === tmp[i], "arr[" + i + "] = " + arr[i] + " expected " + tmp[i]);
arr = new Object();
arr.length = 3;
arr[0] = 1;
arr[2] = "aa";
arr.sort = Array.prototype.sort;
tmp = arr.sort();
ok(arr === tmp, "tmp !== arr");
ok(arr[0]===1 && arr[1]==="aa" && arr[2]===undefined, "arr is sorted incorectly");
arr = ["1", "2", "3"];
arr.length = 1;
ok(arr.length === 1, "arr.length = " + arr.length);
@ -644,9 +717,34 @@ ok(arr.toString() === "a,b,c", "arr.toString() = " + arr.toString());
ok(arr.valueOf === Object.prototype.valueOf, "arr.valueOf !== Object.prototype.valueOf");
ok(arr === arr.valueOf(), "arr !== arr.valueOf");
arr = [1,2,3];
tmp = arr.reverse();
ok(tmp === arr, "tmp !== arr");
ok(arr.length === 3, "arr.length = " + arr.length);
ok(arr.toString() === "3,2,1", "arr.toString() = " + arr.toString());
arr = [];
arr[3] = 5;
arr[5] = 1;
tmp = arr.reverse();
ok(tmp === arr, "tmp !== arr");
ok(arr.length === 6, "arr.length = " + arr.length);
ok(arr.toString() === "1,,5,,,", "arr.toString() = " + arr.toString());
arr = new Object();
arr.length = 3;
arr[0] = "aa";
arr[2] = 2;
arr[7] = 3;
arr.reverse = Array.prototype.reverse;
tmp = arr.reverse();
ok(tmp === arr, "tmp !== arr");
ok(arr.length === 3, "arr.length = " + arr.length);
ok(arr[0] === 2 && arr[1] === undefined && arr[2] === "aa", "unexpected array");
arr = [1,2,3];
tmp = arr.unshift(0);
ok(tmp === undefined, "[1,2,3].unshift(0) returned " +tmp);
ok(tmp === (invokeVersion < 2 ? undefined : 4), "[1,2,3].unshift(0) returned " +tmp);
ok(arr.length === 4, "arr.length = " + arr.length);
ok(arr.toString() === "0,1,2,3", "arr.toString() = " + arr.toString());
@ -654,13 +752,13 @@ arr = new Array(3);
arr[0] = 1;
arr[2] = 3;
tmp = arr.unshift(-1,0);
ok(tmp === undefined, "unshift returned " +tmp);
ok(tmp === (invokeVersion < 2 ? undefined : 5), "unshift returned " +tmp);
ok(arr.length === 5, "arr.length = " + arr.length);
ok(arr.toString() === "-1,0,1,,3", "arr.toString() = " + arr.toString());
arr = [1,2,3];
tmp = arr.unshift();
ok(tmp === undefined, "unshift returned " +tmp);
ok(tmp === (invokeVersion < 2 ? undefined : 3), "unshift returned " +tmp);
ok(arr.length === 3, "arr.length = " + arr.length);
ok(arr.toString() === "1,2,3", "arr.toString() = " + arr.toString());
@ -669,7 +767,7 @@ arr.length = 2;
arr[0] = 1;
arr[1] = 2;
tmp = Array.prototype.unshift.call(arr, 0);
ok(tmp === undefined, "unshift returned " +tmp);
ok(tmp === (invokeVersion < 2 ? undefined : 3), "unshift returned " +tmp);
ok(arr.length === 3, "arr.length = " + arr.length);
ok(arr[0] === 0 && arr[1] === 1 && arr[2] === 2, "unexpected array");
@ -1374,14 +1472,65 @@ callTest2.apply(tmp);
(function () { callTest2.apply(tmp, arguments); })();
function callTest3() {
testThis(this);
ok(arguments.length === 0, "arguments.length = " + arguments.length + " expected 0");
}
callTest3.call();
callTest3.call(undefined);
callTest3.call(null);
callTest3.apply();
callTest3.apply(undefined);
callTest3.apply(null);
tmp = Number.prototype.toString.call(3);
ok(tmp === "3", "Number.prototype.toString.call(3) = " + tmp);
var func = new Function("return 3;");
tmp = func();
ok(tmp === 3, "func() = " + tmp);
ok(func.call() === 3, "func.call() = " + tmp);
ok(func.length === 0, "func.length = " + func.length);
tmp = func.toString();
ok(tmp === "function anonymous() {\nreturn 3;\n}", "func.toString() = " + tmp);
func = new Function("x", "return x+2;");
tmp = func(1);
ok(tmp === 3, "func(1) = " + tmp);
tmp = func.toString();
ok(tmp === "function anonymous(x) {\nreturn x+2;\n}", "func.toString() = " + tmp);
tmp = (new Function("x ", "return x+2;")).toString();
ok(tmp === "function anonymous(x ) {\nreturn x+2;\n}", "func.toString() = " + tmp);
func = new Function("x", "y", "return x+y");
tmp = func(1,3);
ok(tmp === 4, "func(1,3) = " + tmp);
tmp = func.toString();
ok(tmp === "function anonymous(x, y) {\nreturn x+y\n}", "func.toString() = " + tmp);
func = new Function(" x, \ty", "\tz", "return x+y+z;");
tmp = func(1,3,2);
ok(tmp === 6, "func(1,3,2) = " + tmp);
ok(func.length === 3, "func.length = " + func.length);
tmp = func.toString();
ok(tmp === "function anonymous( x, \ty, \tz) {\nreturn x+y+z;\n}", "func.toString() = " + tmp);
func = new Function();
tmp = func();
ok(tmp === undefined, "func() = " + tmp);
tmp = func.toString();
ok(tmp == "function anonymous() {\n\n}", "func.toString() = " + tmp);
func = (function() {
var tmp = 3;
return new Function("return tmp;");
})();
tmp = 2;
tmp = func();
ok(tmp === 2, "func() = " + tmp);
var date = new Date();
date = new Date(100);
@ -1566,7 +1715,7 @@ ok(Error.prototype.name === "Error", "Error.prototype.name = " + Error.prototype
ok(err.name === "Error", "err.name = " + err.name);
EvalError.prototype.message = "test";
ok(err.toString !== Object.prototype.toString, "err.toString === Object.prototype.toString");
ok(err.toString() === "[object Error]", "err.toString() = " + err.toString());
ok(err.toString() === (invokeVersion < 2 ? "[object Error]" : "Error"), "err.toString() = " + err.toString());
err = new EvalError();
ok(EvalError.prototype.name === "EvalError", "EvalError.prototype.name = " + EvalError.prototype.name);
ok(err.name === "EvalError", "err.name = " + err.name);
@ -1574,31 +1723,32 @@ ok(err.toString === Error.prototype.toString, "err.toString !== Error.prototype.
ok(err.message === "", "err.message != ''");
err.message = date;
ok(err.message === date, "err.message != date");
ok(err.toString() === "[object Error]", "err.toString() = " + err.toString());
ok(err.toString() === (invokeVersion < 2 ? "[object Error]" : "EvalError: "+err.message),
"err.toString() = " + err.toString());
ok(err.toString !== Object.prototype.toString, "err.toString === Object.prototype.toString");
err = new RangeError();
ok(RangeError.prototype.name === "RangeError", "RangeError.prototype.name = " + RangeError.prototype.name);
ok(err.name === "RangeError", "err.name = " + err.name);
ok(err.toString() === "[object Error]", "err.toString() = " + err.toString());
ok(err.toString() === (invokeVersion < 2 ? "[object Error]" : "RangeError"), "err.toString() = " + err.toString());
err = new ReferenceError();
ok(ReferenceError.prototype.name === "ReferenceError", "ReferenceError.prototype.name = " + ReferenceError.prototype.name);
ok(err.name === "ReferenceError", "err.name = " + err.name);
ok(err.toString() === "[object Error]", "err.toString() = " + err.toString());
ok(err.toString() === (invokeVersion < 2 ? "[object Error]" : "ReferenceError"), "err.toString() = " + err.toString());
err = new SyntaxError();
ok(SyntaxError.prototype.name === "SyntaxError", "SyntaxError.prototype.name = " + SyntaxError.prototype.name);
ok(err.name === "SyntaxError", "err.name = " + err.name);
ok(err.toString() === "[object Error]", "err.toString() = " + err.toString());
ok(err.toString() === (invokeVersion < 2 ? "[object Error]" : "SyntaxError"), "err.toString() = " + err.toString());
err = new TypeError();
ok(TypeError.prototype.name === "TypeError", "TypeError.prototype.name = " + TypeError.prototype.name);
ok(err.name === "TypeError", "err.name = " + err.name);
ok(err.toString() === "[object Error]", "err.toString() = " + err.toString());
ok(err.toString() === (invokeVersion < 2 ? "[object Error]" : "TypeError"), "err.toString() = " + err.toString());
err = new URIError();
ok(URIError.prototype.name === "URIError", "URIError.prototype.name = " + URIError.prototype.name);
ok(err.name === "URIError", "err.name = " + err.name);
ok(err.toString() === "[object Error]", "err.toString() = " + err.toString());
ok(err.toString() === (invokeVersion < 2 ? "[object Error]" : "URIError"), "err.toString() = " + err.toString());
err = new Error("message");
ok(err.message === "message", "err.message !== 'message'");
ok(err.toString() === "[object Error]", "err.toString() = " + err.toString());
ok(err.toString() === (invokeVersion < 2 ? "[object Error]" : "Error: message"), "err.toString() = " + err.toString());
err = new Error(123);
ok(err.number === 123, "err.number = " + err.number);
err = new Error(0, "message");
@ -1606,6 +1756,35 @@ ok(err.number === 0, "err.number = " + err.number);
ok(err.message === "message", "err.message = " + err.message);
ok(err.description === "message", "err.description = " + err.description);
tmp = new Object();
tmp.toString = function() { return "test"; };
tmp = Error.prototype.toString.call(tmp);
ok(tmp === "[object Error]", "Error.prototype.toString.call(tmp) = " + tmp);
err = new Error();
err.name = null;
ok(err.name === null, "err.name = " + err.name + " expected null");
if(invokeVersion >= 2)
ok(err.toString() === "null", "err.toString() = " + err.toString());
err = new Error();
err.message = false;
ok(err.message === false, "err.message = " + err.message + " expected false");
if(invokeVersion >= 2)
ok(err.toString() === "Error: false", "err.toString() = " + err.toString());
err = new Error();
err.message = new Object();
err.message.toString = function() { return ""; };
if(invokeVersion >= 2)
ok(err.toString() === "Error", "err.toString() = " + err.toString());
err = new Error();
err.message = undefined;
if(invokeVersion >= 2)
ok(err.toString() === "Error", "err.toString() = " + err.toString());
function exception_test(func, type, number) {
ret = "";
num = "";
@ -1648,6 +1827,7 @@ exception_test(function() {eval("if(")}, "SyntaxError", -2146827286);
exception_test(function() {eval("'unterminated")}, "SyntaxError", -2146827273);
exception_test(function() {eval("nonexistingfunc()")}, "TypeError", -2146823281);
exception_test(function() {RegExp(/a/, "g");}, "RegExpError", -2146823271);
exception_test(function() {encodeURI('\udcaa');}, "URIError", -2146823264);
function testThisExcept(func, number) {
exception_test(function() {func.call(new Object())}, "TypeError", number);
@ -1729,6 +1909,10 @@ testArrayHostThis("shift");
testArrayHostThis("slice");
testArrayHostThis("splice");
testArrayHostThis("unshift");
testArrayHostThis("reverse");
testArrayHostThis("join");
testArrayHostThis("pop");
testArrayHostThis("sort");
function testObjectInherit(obj, constr, ts, tls, vo) {
ok(obj instanceof Object, "obj is not instance of Object");
@ -1941,4 +2125,43 @@ testFunctions(Function.prototype, [
["toString", 0]
]);
ok(ActiveXObject.length == 1, "ActiveXObject.length = " + ActiveXObject.length);
ok(Array.length == 1, "Array.length = " + Array.length);
ok(Boolean.length == 1, "Boolean.length = " + Boolean.length);
ok(CollectGarbage.length == 0, "CollectGarbage.length = " + CollectGarbage.length);
//ok(Date.length == 7, "Date.length = " + Date.length);
ok(Enumerator.length == 7, "Enumerator.length = " + Enumerator.length);
ok(Error.length == 1, "Error.length = " + Error.length);
ok(EvalError.length == 1, "EvalError.length = " + EvalError.length);
ok(Function.length == 1, "Function.length = " + Function.length);
ok(GetObject.length == 2, "GetObject.length = " + GetObject.length);
ok(Number.length == 1, "Number.length = " + Number.length);
ok(Object.length == 0, "Object.length = " + Object.length);
ok(RangeError.length == 1, "RangeError.length = " + RangeError.length);
ok(ReferenceError.length == 1, "ReferenceError.length = " + ReferenceError.length);
ok(RegExp.length == 2, "RegExp.length = " + RegExp.length);
ok(ScriptEngine.length == 0, "ScriptEngine.length = " + ScriptEngine.length);
ok(ScriptEngineBuildVersion.length == 0,
"ScriptEngineBuildVersion.length = " + ScriptEngineBuildVersion.length);
ok(ScriptEngineMajorVersion.length == 0,
"ScriptEngineMajorVersion.length = " + ScriptEngineMajorVersion.length);
ok(ScriptEngineMinorVersion.length == 0,
"ScriptEngineMinorVersion.length = " + ScriptEngineMinorVersion.length);
//ok(String.length == 1, "String.length = " + String.length);
ok(SyntaxError.length == 1, "SyntaxError.length = " + SyntaxError.length);
ok(TypeError.length == 1, "TypeError.length = " + TypeError.length);
ok(URIError.length == 1, "URIError.length = " + URIError.length);
ok(VBArray.length == 1, "VBArray.length = " + VBArray.length);
ok(decodeURI.length == 1, "decodeURI.length = " + decodeURI.length);
ok(decodeURIComponent.length == 1, "decodeURIComponent.length = " + decodeURIComponent.length);
ok(encodeURI.length == 1, "encodeURI.length = " + encodeURI.length);
ok(encodeURIComponent.length == 1, "encodeURIComponent.length = " + encodeURIComponent.length);
ok(escape.length == 1, "escape.length = " + escape.length);
ok(eval.length == 1, "eval.length = " + eval.length);
ok(isFinite.length == 1, "isFinite.length = " + isFinite.length);
ok(isNaN.length == 1, "isNaN.length = " + isNaN.length);
ok(parseFloat.length == 1, "parseFloat.length = " + parseFloat.length);
ok(parseInt.length == 2, "parseInt.length = " + parseInt.length);
ok(unescape.length == 1, "unescape.length = " + unescape.length);
reportSuccess();

View file

@ -203,37 +203,70 @@ static const IActiveScriptSiteVtbl ActiveScriptSiteVtbl = {
static IActiveScriptSite ActiveScriptSite = { &ActiveScriptSiteVtbl };
static void test_script_dispatch(IActiveScript *script, BOOL initialized)
static void test_script_dispatch(IDispatchEx *dispex)
{
IDispatchEx *dispex;
IDispatch *disp;
DISPPARAMS dp = {NULL,NULL,0,0};
EXCEPINFO ei;
BSTR str;
DISPID id;
VARIANT v;
HRESULT hres;
disp = (void*)0xdeadbeef;
hres = IActiveScript_GetScriptDispatch(script, NULL, &disp);
if(!initialized) {
ok(hres == E_UNEXPECTED, "hres = %08x, expected E_UNEXPECTED\n", hres);
ok(!disp, "disp != NULL\n");
return;
}
ok(hres == S_OK, "GetScriptDispatch failed: %08x\n", hres);
if(FAILED(hres))
return;
ok(disp != NULL, "disp == NULL\n");
hres = IDispatch_QueryInterface(disp, &IID_IDispatchEx, (void**)&dispex);
IDispatch_Release(disp);
ok(hres == S_OK, "Could not get IDispatchEx interface: %08x\n", hres);
str = a2bstr("ActiveXObject");
hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseSensitive, &id);
SysFreeString(str);
ok(hres == S_OK, "GetDispID failed: %08x\n", hres);
IDispatchEx_Release(dispex);
str = a2bstr("Math");
hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseSensitive, &id);
SysFreeString(str);
ok(hres == S_OK, "GetDispID failed: %08x\n", hres);
memset(&ei, 0, sizeof(ei));
hres = IDispatchEx_InvokeEx(dispex, id, 0, DISPATCH_PROPERTYGET, &dp, &v, &ei, NULL);
ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
ok(V_VT(&v) == VT_DISPATCH, "V_VT(v) = %d\n", V_VT(&v));
ok(V_DISPATCH(&v) != NULL, "V_DISPATCH(v) = NULL\n");
VariantClear(&v);
str = a2bstr("String");
hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseSensitive, &id);
SysFreeString(str);
ok(hres == S_OK, "GetDispID failed: %08x\n", hres);
memset(&ei, 0, sizeof(ei));
hres = IDispatchEx_InvokeEx(dispex, id, 0, DISPATCH_PROPERTYGET, &dp, &v, &ei, NULL);
ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
ok(V_VT(&v) == VT_DISPATCH, "V_VT(v) = %d\n", V_VT(&v));
ok(V_DISPATCH(&v) != NULL, "V_DISPATCH(v) = NULL\n");
VariantClear(&v);
}
static IDispatchEx *get_script_dispatch(IActiveScript *script)
{
IDispatchEx *dispex;
IDispatch *disp;
HRESULT hres;
disp = (void*)0xdeadbeef;
hres = IActiveScript_GetScriptDispatch(script, NULL, &disp);
ok(hres == S_OK, "GetScriptDispatch failed: %08x\n", hres);
IDispatch_QueryInterface(disp, &IID_IDispatchEx, (void**)&dispex);
IDispatch_Release(disp);
ok(hres == S_OK, "Could not get IDispatch iface: %08x\n", hres);
return dispex;
}
static void test_no_script_dispatch(IActiveScript *script)
{
IDispatch *disp;
HRESULT hres;
disp = (void*)0xdeadbeef;
hres = IActiveScript_GetScriptDispatch(script, NULL, &disp);
ok(hres == E_UNEXPECTED, "hres = %08x, expected E_UNEXPECTED\n", hres);
ok(!disp, "disp != NULL\n");
}
static void test_safety(IUnknown *unk)
@ -295,10 +328,54 @@ static void test_safety(IUnknown *unk)
IObjectSafety_Release(safety);
}
static HRESULT set_script_prop(IActiveScript *engine, DWORD property, VARIANT *val)
{
IActiveScriptProperty *script_prop;
HRESULT hres;
hres = IActiveScript_QueryInterface(engine, &IID_IActiveScriptProperty,
(void**)&script_prop);
ok(hres == S_OK, "Could not get IActiveScriptProperty iface: %08x\n", hres);
hres = IActiveScriptProperty_SetProperty(script_prop, property, NULL, val);
IActiveScriptProperty_Release(script_prop);
return hres;
}
static void test_invoke_versioning(IActiveScript *script)
{
VARIANT v;
HRESULT hres;
V_VT(&v) = VT_NULL;
hres = set_script_prop(script, SCRIPTPROP_INVOKEVERSIONING, &v);
if(hres == E_NOTIMPL) {
win_skip("SCRIPTPROP_INVOKESTRING not supported\n");
return;
}
ok(hres == E_INVALIDARG, "SetProperty(SCRIPTPROP_INVOKEVERSIONING) failed: %08x\n", hres);
V_VT(&v) = VT_I2;
V_I2(&v) = 0;
hres = set_script_prop(script, SCRIPTPROP_INVOKEVERSIONING, &v);
ok(hres == E_INVALIDARG, "SetProperty(SCRIPTPROP_INVOKEVERSIONING) failed: %08x\n", hres);
V_VT(&v) = VT_I4;
V_I4(&v) = 16;
hres = set_script_prop(script, SCRIPTPROP_INVOKEVERSIONING, &v);
ok(hres == E_INVALIDARG, "SetProperty(SCRIPTPROP_INVOKEVERSIONING) failed: %08x\n", hres);
V_VT(&v) = VT_I4;
V_I4(&v) = 2;
hres = set_script_prop(script, SCRIPTPROP_INVOKEVERSIONING, &v);
ok(hres == S_OK, "SetProperty(SCRIPTPROP_INVOKEVERSIONING) failed: %08x\n", hres);
}
static void test_jscript(void)
{
IActiveScriptParse *parse;
IActiveScript *script;
IDispatchEx *dispex;
IUnknown *unk;
ULONG ref;
HRESULT hres;
@ -322,6 +399,7 @@ static void test_jscript(void)
test_state(script, SCRIPTSTATE_UNINITIALIZED);
test_safety(unk);
test_invoke_versioning(script);
hres = IActiveScriptParse64_InitNew(parse);
ok(hres == S_OK, "InitNew failed: %08x\n", hres);
@ -333,7 +411,7 @@ static void test_jscript(void)
ok(hres == E_POINTER, "SetScriptSite failed: %08x, expected E_POINTER\n", hres);
test_state(script, SCRIPTSTATE_UNINITIALIZED);
test_script_dispatch(script, FALSE);
test_no_script_dispatch(script);
SET_EXPECT(GetLCID);
SET_EXPECT(OnStateChange_INITIALIZED);
@ -347,7 +425,8 @@ static void test_jscript(void)
hres = IActiveScript_SetScriptSite(script, &ActiveScriptSite);
ok(hres == E_UNEXPECTED, "SetScriptSite failed: %08x, expected E_UNEXPECTED\n", hres);
test_script_dispatch(script, TRUE);
dispex = get_script_dispatch(script);
test_script_dispatch(dispex);
SET_EXPECT(OnStateChange_STARTED);
hres = IActiveScript_SetScriptState(script, SCRIPTSTATE_STARTED);
@ -362,7 +441,9 @@ static void test_jscript(void)
CHECK_CALLED(OnStateChange_CLOSED);
test_state(script, SCRIPTSTATE_CLOSED);
test_script_dispatch(script, FALSE);
test_no_script_dispatch(script);
test_script_dispatch(dispex);
IDispatchEx_Release(dispex);
IUnknown_Release(parse);
IActiveScript_Release(script);
@ -430,7 +511,7 @@ static void test_jscript2(void)
CHECK_CALLED(OnStateChange_CLOSED);
test_state(script, SCRIPTSTATE_CLOSED);
test_script_dispatch(script, FALSE);
test_no_script_dispatch(script);
IUnknown_Release(parse);
IActiveScript_Release(script);

View file

@ -3,13 +3,15 @@
<group>
<module name="jscript_winetest" type="win32cui" installbase="bin" installname="jscript_winetest.exe" allowwarnings="true">
<include base="jscript_winetest">.</include>
<define name="__ROS_LONG64__" />
<define name="__ROS_LONG64__" />
<file>activex.c</file>
<file>jscript.c</file>
<file>run.c</file>
<file>testlist.c</file>
<file>rsrc.rc</file>
<library>wine</library>
<library>ole32</library>
<library>advapi32</library>
<library>oleaut32</library>
<library>ntdll</library>
</module>

View file

@ -109,8 +109,14 @@ ok(typeof(this) === "object", "typeof(this) is not object");
ok(testFunc1(true, "test") === true, "testFunc1 not returned true");
tmp = (function() {1;})();
ok(tmp === undefined, "tmp = " + tmp);
tmp = eval("1;");
ok(tmp === 1, "tmp = " + tmp);
var obj1 = new Object();
ok(typeof(obj1) === "object", "typeof(obj1) is not object");
ok(obj1.constructor === Object, "unexpected obj1.constructor");
obj1.test = true;
obj1.func = function () {
ok(this === obj1, "this is not obj1");
@ -139,6 +145,7 @@ testConstr1.prototype.pvar = 1;
var obj2 = new testConstr1(true);
ok(typeof(obj2) === "object", "typeof(obj2) is not object");
ok(obj2.constructor === testConstr1, "unexpected obj2.constructor");
ok(obj2.pvar === 1, "obj2.pvar is not 1");
testConstr1.prototype.pvar = 2;
@ -148,6 +155,21 @@ obj2.pvar = 3;
testConstr1.prototype.pvar = 1;
ok(obj2.pvar === 3, "obj2.pvar is not 3");
obj1 = new Object();
function testConstr3() {
return obj1;
}
obj2 = new testConstr3();
ok(obj1 === obj2, "obj1 != obj2");
function testConstr4() {
return 2;
}
obj2 = new testConstr3();
ok(typeof(obj2) === "object", "typeof(obj2) = " + typeof(obj2));
var obj3 = new Object;
ok(typeof(obj3) === "object", "typeof(obj3) is not object");
@ -189,6 +211,7 @@ if(false) {
var obj3 = { prop1: 1, prop2: typeof(false) };
ok(obj3.prop1 === 1, "obj3.prop1 is not 1");
ok(obj3.prop2 === "boolean", "obj3.prop2 is not \"boolean\"");
ok(obj3.constructor === Object, "unexpected obj3.constructor");
{
var blockVar = 1;
@ -326,6 +349,15 @@ tmp = -3.5 | 0;
ok(tmp === -3, "-3.5 | 0 !== -3");
ok(getVT(tmp) === "VT_I4", "getVT(3.5|0) = " + getVT(tmp));
tmp = 0 | NaN;
ok(tmp === 0, "0 | NaN = " + tmp);
tmp = 0 | Infinity;
ok(tmp === 0, "0 | NaN = " + tmp);
tmp = 0 | (-Infinity);
ok(tmp === 0, "0 | NaN = " + tmp);
tmp = 10;
ok((tmp |= 0x10) === 26, "tmp(10) |= 0x10 !== 26");
ok(getVT(tmp) === "VT_I4", "getVT(tmp |= 10) = " + getVT(tmp));
@ -360,6 +392,9 @@ ok(tmp === 2, "8 >> 2 = " + tmp);
tmp = -64 >>> 4;
ok(tmp === 0x0ffffffc, "-64 >>> 4 = " + tmp);
tmp = 4 >>> NaN;
ok(tmp === 4, "4 >>> NaN = " + tmp);
tmp = 10;
ok((tmp &= 8) === 8, "tmp(10) &= 8 !== 8");
ok(getVT(tmp) === "VT_I4", "getVT(tmp &= 8) = " + getVT(tmp));
@ -390,8 +425,10 @@ ok(+"3e3" === 3000, "+'3e3' !== 3000");
tmp = new Number(1);
ok(+tmp === 1, "+(new Number(1)) = " + (+tmp));
ok(tmp.constructor === Number, "unexpected tmp.constructor");
tmp = new String("1");
ok(+tmp === 1, "+(new String('1')) = " + (+tmp));
ok(tmp.constructor === String, "unexpected tmp.constructor");
ok("" + 0 === "0", "\"\" + 0 !== \"0\"");
ok("" + 123 === "123", "\"\" + 123 !== \"123\"");
@ -831,6 +868,13 @@ ok(("1" in obj) === false, "1 is in obj");
obj = [1,2,3];
ok((1 in obj) === true, "1 is not in obj");
obj = new Object();
try {
obj.prop["test"];
ok(false, "expected exception");
}catch(e) {}
ok(!("prop" in obj), "prop in obj");
ok(isNaN(NaN) === true, "isNaN(NaN) !== true");
ok(isNaN(0.5) === false, "isNaN(0.5) !== false");
ok(isNaN(Infinity) === false, "isNaN(Infinity) !== false");
@ -934,6 +978,11 @@ ok((function (){return 1;})() === 1, "(function (){return 1;})() = " + (function
var re = /=(\?|%3F)/g;
ok(re.source === "=(\\?|%3F)", "re.source = " + re.source);
tmp = new Array();
for(var i=0; i<2; i++)
tmp[i] = /b/;
ok(tmp[0] != tmp[1], "tmp[0] == tmp [1]");
ok(createNullBSTR() === '', "createNullBSTR() !== ''");
ok(getVT(nullDisp) === "VT_DISPATCH", "getVT(nullDisp) = " + getVT(nullDisp));
@ -969,4 +1018,10 @@ ok(typeof(doesnotexist) === "undefined", "typeof(doesnotexist) = " + typeof(does
(function() { newValue = 1; })();
ok(newValue === 1, "newValue = " + newValue);
obj = {undefined: 3};
/* Keep this test in the end of file */
undefined = 6;
ok(undefined === 6, "undefined = " + undefined);
reportSuccess();

View file

@ -17,7 +17,7 @@
*/
var m, re, b;
var m, re, b, i, obj;
re = /a+/;
ok(re.lastIndex === 0, "re.lastIndex = " + re.lastIndex);
@ -71,6 +71,11 @@ m = re.exec();
ok(m === null, "m is not null");
ok(re.lastIndex === 0, "re.lastIndex = " + re.lastIndex);
m = /(a|b)+|(c)/.exec("aa");
ok(m[0] === "aa", "m[0] = " + m[0]);
ok(m[1] === "a", "m[1] = " + m[1]);
ok(m[2] === "", "m[2] = " + m[2]);
b = re.test(" a ");
ok(b === true, "re.test(' a ') returned " + b);
ok(re.lastIndex === 3, "re.lastIndex = " + re.lastIndex);
@ -91,10 +96,12 @@ ok(m[1] === "test", "m[1] = " + m[1]);
b = /a*/.test();
ok(b === true, "/a*/.test() returned " + b);
m = "abcabc".match(/ca/);
m = "abcabc".match(re = /ca/);
ok(typeof(m) === "object", "typeof m is not object");
ok(m.length === 1, "m.length is not 1");
ok(m["0"] === "ca", "m[0] is not \"ca\"");
ok(m.constructor === Array, "unexpected m.constructor");
ok(re.lastIndex === 4, "re.lastIndex = " + re.lastIndex);
m = "abcabc".match(/ab/);
ok(typeof(m) === "object", "typeof m is not object");
@ -160,8 +167,9 @@ ok(m["0"] === "ab", "m[0] is not \"ab\"");
m = "abcabc".match();
ok(m === null, "m is not null");
r = "- [test] -".replace(/\[([^\[]+)\]/g, "success");
r = "- [test] -".replace(re = /\[([^\[]+)\]/g, "success");
ok(r === "- success -", "r = " + r + " expected '- success -'");
ok(re.lastIndex === 8, "re.lastIndex = " + re.lastIndex);
r = "[test] [test]".replace(/\[([^\[]+)\]/g, "aa");
ok(r === "aa aa", "r = " + r + "aa aa");
@ -280,6 +288,41 @@ ok(r.length === 2, "r.length = " + r.length);
ok(r[0] === "1", "r[0] = " + r[0]);
ok(r[1] === "2", "r[1] = " + r[1]);
re = /,+/;
r = "1,,2,".split(re);
ok(r.length === 2, "r.length = " + r.length);
ok(r[0] === "1", "r[0] = " + r[0]);
ok(r[1] === "2", "r[1] = " + r[1]);
ok(re.lastIndex === 5, "re.lastIndex = " + re.lastIndex);
re = /,+/g;
r = "1,,2,".split(re);
ok(r.length === 2, "r.length = " + r.length);
ok(r[0] === "1", "r[0] = " + r[0]);
ok(r[1] === "2", "r[1] = " + r[1]);
ok(re.lastIndex === 5, "re.lastIndex = " + re.lastIndex);
r = "1 12 \t3".split(re = /\s+/).join(";");
ok(r === "1;12;3", "r = " + r);
ok(re.lastIndex === 6, "re.lastIndex = " + re.lastIndex);
r = "123".split(re = /\s+/).join(";");
ok(r === "123", "r = " + r);
ok(re.lastIndex === 0, "re.lastIndex = " + re.lastIndex);
/* another standard violation */
r = "1 12 \t3".split(re = /(\s)+/g).join(";");
ok(r === "1;12;3", "r = " + r);
ok(re.lastIndex === 6, "re.lastIndex = " + re.lastIndex);
re = /,+/;
re.lastIndex = 4;
r = "1,,2,".split(re);
ok(r.length === 2, "r.length = " + r.length);
ok(r[0] === "1", "r[0] = " + r[0]);
ok(r[1] === "2", "r[1] = " + r[1]);
ok(re.lastIndex === 5, "re.lastIndex = " + re.lastIndex);
re = /abc[^d]/g;
ok(re.source === "abc[^d]", "re.source = '" + re.source + "', expected 'abc[^d]'");
@ -298,4 +341,117 @@ ok(re === RegExp(re, undefined), "re !== RegExp(re, undefined)");
re = /abc/;
ok(re === RegExp(re, undefined, 1), "re !== RegExp(re, undefined, 1)");
re = /a/g;
ok(re.lastIndex === 0, "re.lastIndex = " + re.lastIndex + " expected 0");
m = re.exec(" a ");
ok(re.lastIndex === 2, "re.lastIndex = " + re.lastIndex + " expected 2");
ok(m.index === 1, "m.index = " + m.index + " expected 1");
m = re.exec(" a ");
ok(re.lastIndex === 0, "re.lastIndex = " + re.lastIndex + " expected 0");
ok(m === null, "m = " + m + " expected null");
re.lastIndex = 2;
m = re.exec(" a a ");
ok(re.lastIndex === 4, "re.lastIndex = " + re.lastIndex + " expected 4");
ok(m.index === 3, "m.index = " + m.index + " expected 3");
re.lastIndex = "2";
ok(re.lastIndex === "2", "re.lastIndex = " + re.lastIndex + " expected '2'");
m = re.exec(" a a ");
ok(re.lastIndex === 4, "re.lastIndex = " + re.lastIndex + " expected 4");
ok(m.index === 3, "m.index = " + m.index + " expected 3");
var li = 0;
var obj = new Object();
obj.valueOf = function() { return li; };
re.lastIndex = obj;
ok(re.lastIndex === obj, "re.lastIndex = " + re.lastIndex + " expected obj");
li = 2;
m = re.exec(" a a ");
ok(re.lastIndex === 2, "re.lastIndex = " + re.lastIndex + " expected 2");
ok(m.index === 1, "m.index = " + m.index + " expected 1");
re.lastIndex = 3;
re.lastIndex = "test";
ok(re.lastIndex === "test", "re.lastIndex = " + re.lastIndex + " expected 'test'");
m = re.exec(" a a ");
ok(re.lastIndex === 2 || re.lastIndex === 0, "re.lastIndex = " + re.lastIndex + " expected 2 or 0");
if(re.lastIndex != 0)
ok(m.index === 1, "m.index = " + m.index + " expected 1");
else
ok(m === null, "m = " + m + " expected null");
re.lastIndex = 0;
re.lastIndex = 3.9;
ok(re.lastIndex === 3.9, "re.lastIndex = " + re.lastIndex + " expected 3.9");
m = re.exec(" a a ");
ok(re.lastIndex === 4, "re.lastIndex = " + re.lastIndex + " expected 4");
ok(m.index === 3, "m.index = " + m.index + " expected 3");
obj.valueOf = function() { throw 0; }
re.lastIndex = obj;
ok(re.lastIndex === obj, "unexpected re.lastIndex");
m = re.exec(" a a ");
ok(re.lastIndex === 2, "re.lastIndex = " + re.lastIndex + " expected 2");
ok(m.index === 1, "m.index = " + m.index + " expected 1");
re.lastIndex = -3;
ok(re.lastIndex === -3, "re.lastIndex = " + re.lastIndex + " expected -3");
m = re.exec(" a a ");
ok(re.lastIndex === 0, "re.lastIndex = " + re.lastIndex + " expected 0");
ok(m === null, "m = " + m + " expected null");
re.lastIndex = -1;
ok(re.lastIndex === -1, "re.lastIndex = " + re.lastIndex + " expected -1");
m = re.exec(" ");
ok(re.lastIndex === 0, "re.lastIndex = " + re.lastIndex + " expected 0");
ok(m === null, "m = " + m + " expected null");
re = /aa/g;
i = 'baacd'.search(re);
ok(i === 1, "'baacd'.search(re) = " + i);
ok(re.lastIndex === 3, "re.lastIndex = " + re.lastIndex);
re.lastIndex = 2;
i = 'baacdaa'.search(re);
ok(i === 1, "'baacd'.search(re) = " + i);
ok(re.lastIndex === 3, "re.lastIndex = " + re.lastIndex);
re = /aa/;
i = 'baacd'.search(re);
ok(i === 1, "'baacd'.search(re) = " + i);
ok(re.lastIndex === 3, "re.lastIndex = " + re.lastIndex);
re.lastIndex = 2;
i = 'baacdaa'.search(re);
ok(i === 1, "'baacd'.search(re) = " + i);
ok(re.lastIndex === 3, "re.lastIndex = " + re.lastIndex);
re = /d/g;
re.lastIndex = 1;
i = 'abc'.search(re);
ok(i === -1, "'abc'.search(/d/g) = " + i);
ok(re.lastIndex === 0, "re.lastIndex = " + re.lastIndex);
i = 'abcdde'.search(/[df]/);
ok(i === 3, "'abc'.search(/[df]/) = " + i);
i = 'abcdde'.search(/[df]/, "a");
ok(i === 3, "'abc'.search(/[df]/) = " + i);
i = 'abcdde'.search("[df]");
ok(i === 3, "'abc'.search(/d*/) = " + i);
obj = {
toString: function() { return "abc"; }
};
i = String.prototype.search.call(obj, "b");
ok(i === 1, "String.prototype.seatch.apply(obj, 'b') = " + i);
i = " undefined ".search();
ok(i === null, "' undefined '.search() = " + i);
reportSuccess();

View file

@ -81,6 +81,7 @@ DEFINE_EXPECT(GetItemInfo_testVal);
#define DISPID_GLOBAL_NULL_DISP 0x1008
#define DISPID_GLOBAL_TESTTHIS 0x1009
#define DISPID_GLOBAL_TESTTHIS2 0x100a
#define DISPID_GLOBAL_INVOKEVERSION 0x100b
#define DISPID_TESTOBJ_PROP 0x2000
@ -92,6 +93,7 @@ static const CHAR test_valA[] = "testVal";
static BOOL strict_dispid_check;
static const char *test_name = "(null)";
static IDispatch *script_disp;
static int invoke_version;
static BSTR a2bstr(const char *str)
{
@ -112,6 +114,13 @@ static int strcmp_wa(LPCWSTR strw, const char *stra)
return lstrcmpA(buf, stra);
}
#define test_grfdex(a,b) _test_grfdex(__LINE__,a,b)
static void _test_grfdex(unsigned line, DWORD grfdex, DWORD expect)
{
expect |= invoke_version << 28;
ok_(__FILE__,line)(grfdex == expect, "grfdex = %x, expected %x\n", grfdex, expect);
}
static HRESULT WINAPI DispatchEx_QueryInterface(IDispatchEx *iface, REFIID riid, void **ppv)
{
*ppv = NULL;
@ -205,13 +214,13 @@ static HRESULT WINAPI testObj_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD
{
if(!strcmp_wa(bstrName, "prop")) {
CHECK_EXPECT(testobj_prop_d);
ok(grfdex == fdexNameCaseSensitive, "grfdex = %x\n", grfdex);
test_grfdex(grfdex, fdexNameCaseSensitive);
*pid = DISPID_TESTOBJ_PROP;
return S_OK;
}
if(!strcmp_wa(bstrName, "noprop")) {
CHECK_EXPECT(testobj_noprop_d);
ok(grfdex == fdexNameCaseSensitive, "grfdex = %x\n", grfdex);
test_grfdex(grfdex, fdexNameCaseSensitive);
return DISP_E_UNKNOWNNAME;
}
@ -250,7 +259,7 @@ static HRESULT WINAPI testObj_DeleteMemberByName(IDispatchEx *iface, BSTR bstrNa
CHECK_EXPECT(testobj_delete);
ok(!strcmp_wa(bstrName, "deleteTest"), "unexpected name %s\n", wine_dbgstr_w(bstrName));
ok(grfdex == fdexNameCaseSensitive, "grfdex = %x\n", grfdex);
test_grfdex(grfdex, fdexNameCaseSensitive);
return S_OK;
}
@ -277,40 +286,40 @@ static IDispatchEx testObj = { &testObjVtbl };
static HRESULT WINAPI Global_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD grfdex, DISPID *pid)
{
if(!strcmp_wa(bstrName, "ok")) {
ok(grfdex == fdexNameCaseSensitive, "grfdex = %x\n", grfdex);
test_grfdex(grfdex, fdexNameCaseSensitive);
*pid = DISPID_GLOBAL_OK;
return S_OK;
}
if(!strcmp_wa(bstrName, "trace")) {
ok(grfdex == fdexNameCaseSensitive, "grfdex = %x\n", grfdex);
test_grfdex(grfdex, fdexNameCaseSensitive);
*pid = DISPID_GLOBAL_TRACE;
return S_OK;
}
if(!strcmp_wa(bstrName, "reportSuccess")) {
CHECK_EXPECT(global_success_d);
ok(grfdex == fdexNameCaseSensitive, "grfdex = %x\n", grfdex);
test_grfdex(grfdex, fdexNameCaseSensitive);
*pid = DISPID_GLOBAL_REPORTSUCCESS;
return S_OK;
}
if(!strcmp_wa(bstrName, "testPropGet")) {
CHECK_EXPECT(global_propget_d);
ok(grfdex == fdexNameCaseSensitive, "grfdex = %x\n", grfdex);
test_grfdex(grfdex, fdexNameCaseSensitive);
*pid = DISPID_GLOBAL_TESTPROPGET;
return S_OK;
}
if(!strcmp_wa(bstrName, "testPropPut")) {
CHECK_EXPECT(global_propput_d);
ok(grfdex == fdexNameCaseSensitive, "grfdex = %x\n", grfdex);
test_grfdex(grfdex, fdexNameCaseSensitive);
*pid = DISPID_GLOBAL_TESTPROPPUT;
return S_OK;
}
if(!strcmp_wa(bstrName, "getVT")) {
ok(grfdex == fdexNameCaseSensitive, "grfdex = %x\n", grfdex);
test_grfdex(grfdex, fdexNameCaseSensitive);
*pid = DISPID_GLOBAL_GETVT;
return S_OK;
}
if(!strcmp_wa(bstrName, "testObj")) {
ok(grfdex == fdexNameCaseSensitive, "grfdex = %x\n", grfdex);
test_grfdex(grfdex, fdexNameCaseSensitive);
*pid = DISPID_GLOBAL_TESTOBJ;
return S_OK;
}
@ -324,22 +333,28 @@ static HRESULT WINAPI Global_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD
}
if(!strcmp_wa(bstrName, "notExists")) {
CHECK_EXPECT(global_notexists_d);
ok(grfdex == fdexNameCaseSensitive, "grfdex = %x\n", grfdex);
test_grfdex(grfdex, fdexNameCaseSensitive);
return DISP_E_UNKNOWNNAME;
}
if(!strcmp_wa(bstrName, "testThis")) {
ok(grfdex == fdexNameCaseSensitive, "grfdex = %x\n", grfdex);
test_grfdex(grfdex, fdexNameCaseSensitive);
*pid = DISPID_GLOBAL_TESTTHIS;
return S_OK;
}
if(!strcmp_wa(bstrName, "testThis2")) {
ok(grfdex == fdexNameCaseSensitive, "grfdex = %x\n", grfdex);
test_grfdex(grfdex, fdexNameCaseSensitive);
*pid = DISPID_GLOBAL_TESTTHIS2;
return S_OK;
}
if(!strcmp_wa(bstrName, "invokeVersion")) {
test_grfdex(grfdex, fdexNameCaseSensitive);
*pid = DISPID_GLOBAL_INVOKEVERSION;
return S_OK;
}
if(strict_dispid_check)
ok(0, "unexpected call %s\n", wine_dbgstr_w(bstrName));
return DISP_E_UNKNOWNNAME;
@ -536,6 +551,23 @@ static HRESULT WINAPI Global_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid,
ok(V_DISPATCH(pdp->rgvarg) == script_disp, "disp != script_disp\n");
return S_OK;
case DISPID_GLOBAL_INVOKEVERSION:
ok(wFlags == INVOKE_PROPERTYGET, "wFlags = %x\n", wFlags);
ok(pdp != NULL, "pdp == NULL\n");
ok(!pdp->rgvarg, "rgvarg != NULL\n");
ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs);
ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
ok(pvarRes != NULL, "pvarRes == NULL\n");
ok(V_VT(pvarRes) == VT_EMPTY, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
ok(pei != NULL, "pei == NULL\n");
V_VT(pvarRes) = VT_I4;
V_I4(pvarRes) = invoke_version;
return S_OK;
}
ok(0, "unexpected call %x\n", id);
@ -657,19 +689,44 @@ static const IActiveScriptSiteVtbl ActiveScriptSiteVtbl = {
static IActiveScriptSite ActiveScriptSite = { &ActiveScriptSiteVtbl };
static HRESULT set_script_prop(IActiveScript *engine, DWORD property, VARIANT *val)
{
IActiveScriptProperty *script_prop;
HRESULT hres;
hres = IActiveScript_QueryInterface(engine, &IID_IActiveScriptProperty,
(void**)&script_prop);
ok(hres == S_OK, "Could not get IActiveScriptProperty iface: %08x\n", hres);
hres = IActiveScriptProperty_SetProperty(script_prop, property, NULL, val);
IActiveScriptProperty_Release(script_prop);
return hres;
}
static IActiveScript *create_script(void)
{
IActiveScript *script;
VARIANT v;
HRESULT hres;
hres = CoCreateInstance(&CLSID_JScript, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
&IID_IActiveScript, (void**)&script);
ok(hres == S_OK, "CoCreateInstance failed: %08x\n", hres);
V_VT(&v) = VT_I4;
V_I4(&v) = invoke_version;
hres = set_script_prop(script, SCRIPTPROP_INVOKEVERSIONING, &v);
ok(hres == S_OK || broken(hres == E_NOTIMPL), "SetProperty(SCRIPTPROP_INVOKEVERSIONING) failed: %08x\n", hres);
if(invoke_version && FAILED(hres)) {
IActiveScript_Release(script);
return NULL;
}
return script;
}
static void parse_script(DWORD flags, BSTR script_str)
static HRESULT parse_script(DWORD flags, BSTR script_str)
{
IActiveScriptParse *parser;
IActiveScript *engine;
@ -677,14 +734,14 @@ static void parse_script(DWORD flags, BSTR script_str)
engine = create_script();
if(!engine)
return;
return S_OK;
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;
return hres;
}
hres = IActiveScriptParse64_InitNew(parser);
@ -706,11 +763,12 @@ static void parse_script(DWORD flags, BSTR script_str)
ok(script_disp != (IDispatch*)&Global, "script_disp == Global\n");
hres = IActiveScriptParse64_ParseScriptText(parser, script_str, NULL, NULL, NULL, 0, 0, 0, NULL, NULL);
ok(hres == S_OK, "ParseScriptText failed: %08x\n", hres);
IDispatch_Release(script_disp);
IActiveScript_Release(engine);
IUnknown_Release(parser);
return hres;
}
static HRESULT parse_htmlscript(BSTR script_str)
@ -756,9 +814,13 @@ static HRESULT parse_htmlscript(BSTR script_str)
static void parse_script_af(DWORD flags, const char *src)
{
BSTR tmp = a2bstr(src);
parse_script(flags, tmp);
BSTR tmp;
HRESULT hres;
tmp = a2bstr(src);
hres = parse_script(flags, tmp);
SysFreeString(tmp);
ok(hres == S_OK, "parse_script failed: %08x\n", hres);
}
static void parse_script_a(const char *src)
@ -816,14 +878,17 @@ static BSTR get_script_from_file(const char *filename)
static void run_from_file(const char *filename)
{
BSTR script_str = get_script_from_file(filename);
BSTR script_str;
HRESULT hres;
script_str = get_script_from_file(filename);
if(!script_str)
return;
strict_dispid_check = FALSE;
if(script_str)
parse_script(SCRIPTITEM_GLOBALMEMBERS, script_str);
hres = parse_script(SCRIPTITEM_GLOBALMEMBERS, script_str);
SysFreeString(script_str);
ok(hres == S_OK, "parse_script failed: %08x\n", hres);
}
static void run_from_res(const char *name)
@ -832,6 +897,7 @@ static void run_from_res(const char *name)
DWORD size, len;
BSTR str;
HRSRC src;
HRESULT hres;
strict_dispid_check = FALSE;
test_name = name;
@ -848,10 +914,11 @@ static void run_from_res(const char *name)
SET_EXPECT(global_success_d);
SET_EXPECT(global_success_i);
parse_script(SCRIPTITEM_GLOBALMEMBERS, str);
hres = parse_script(SCRIPTITEM_GLOBALMEMBERS, str);
CHECK_CALLED(global_success_d);
CHECK_CALLED(global_success_i);
ok(hres == S_OK, "parse_script failed: %08x\n", hres);
SysFreeString(str);
}
@ -912,6 +979,17 @@ static void run_tests(void)
{
HRESULT hres;
if(invoke_version) {
IActiveScript *script;
script = create_script();
if(!script) {
win_skip("Could not create script\n");
return;
}
IActiveScript_Release(script);
}
strict_dispid_check = TRUE;
parse_script_a("");
@ -1010,6 +1088,18 @@ static void run_tests(void)
ok(hres != S_OK, "ParseScriptText have not failed\n");
}
static BOOL check_jscript(void)
{
BSTR str;
HRESULT hres;
str = a2bstr("if(!('localeCompare' in String.prototype)) throw 1;");
hres = parse_script(0, str);
SysFreeString(str);
return hres == S_OK;
}
START_TEST(run)
{
int argc;
@ -1019,10 +1109,19 @@ START_TEST(run)
CoInitialize(NULL);
if(argc > 2)
if(!check_jscript()) {
win_skip("Broken engine, probably too old\n");
}else if(argc > 2) {
run_from_file(argv[2]);
else
}else {
trace("invoke version 0\n");
invoke_version = 0;
run_tests();
trace("invoke version 2\n");
invoke_version = 2;
run_tests();
}
CoUninitialize();
}

View file

@ -6,11 +6,13 @@
#define STANDALONE
#include "wine/test.h"
extern void func_activex(void);
extern void func_jscript(void);
extern void func_run(void);
const struct test winetest_testlist[] =
{
{ "activex", func_activex },
{ "jscript", func_jscript },
{ "run", func_run },
{ 0, 0 }