diff --git a/dlls/jscript/math.c b/dlls/jscript/math.c index f67a83d95cf..2c45f8f598d 100644 --- a/dlls/jscript/math.c +++ b/dlls/jscript/math.c @@ -223,8 +223,26 @@ static HRESULT Math_atan(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS * static HRESULT Math_atan2(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) { - FIXME("\n"); - return E_NOTIMPL; + VARIANT v1, v2; + HRESULT hres; + + TRACE("\n"); + + if(arg_cnt(dp)<2) { + if(retv) num_set_nan(retv); + return S_OK; + } + + hres = to_number(dispex->ctx, get_arg(dp, 0), ei, &v1); + if(FAILED(hres)) + return hres; + + hres = to_number(dispex->ctx, get_arg(dp, 1), ei, &v2); + if(FAILED(hres)) + return hres; + + if(retv) num_set_val(retv, atan2(num_val(&v1), num_val(&v2))); + return S_OK; } /* ECMA-262 3rd Edition 15.8.2.6 */ diff --git a/dlls/jscript/tests/api.js b/dlls/jscript/tests/api.js index 2b338a97514..3da1cc78a8a 100644 --- a/dlls/jscript/tests/api.js +++ b/dlls/jscript/tests/api.js @@ -719,6 +719,54 @@ ok(Math.floor(tmp*100) === 157, "Math.atan(Infinity) = " + tmp); tmp = Math.atan(-Infinity); ok(Math.floor(tmp*100) === -158, "Math.atan(Infinity) = " + tmp); +tmp = Math.atan2(0, 0); +ok(Math.floor(tmp*100) === 0, "Math.atan2(0, 0) = " + tmp); + +tmp = Math.atan2(0, 1); +ok(Math.floor(tmp*100) === 0, "Math.atan2(0, 1) = " + tmp); + +tmp = Math.atan2(0, Infinity); +ok(Math.floor(tmp*100) === 0, "Math.atan2(0, Infinity) = " + tmp); + +tmp = Math.atan2(0, -1); +ok(Math.floor(tmp*100) === 314, "Math.atan2(0, -1) = " + tmp); + +tmp = Math.atan2(0, -Infinity); +ok(Math.floor(tmp*100) === 314, "Math.atan2(0, -Infinity) = " + tmp); + +tmp = Math.atan2(1, 0); +ok(Math.floor(tmp*100) === 157, "Math.atan2(1, 0) = " + tmp); + +tmp = Math.atan2(Infinity, 0); +ok(Math.floor(tmp*100) === 157, "Math.atan2(Infinity, 0) = " + tmp); + +tmp = Math.atan2(-1, 0); +ok(Math.floor(tmp*100) === -158, "Math.atan2(-1, 0) = " + tmp); + +tmp = Math.atan2(-Infinity, 0); +ok(Math.floor(tmp*100) === -158, "Math.atan2(-Infinity, 0) = " + tmp); + +tmp = Math.atan2(1, 1); +ok(Math.floor(tmp*100) === 78, "Math.atan2(1, 1) = " + tmp); + +tmp = Math.atan2(-1, -1); +ok(Math.floor(tmp*100) === -236, "Math.atan2(-1, -1) = " + tmp); + +tmp = Math.atan2(-1, 1); +ok(Math.floor(tmp*100) === -79, "Math.atan2(-1, 1) = " + tmp); + +tmp = Math.atan2(Infinity, Infinity); +ok(Math.floor(tmp*100) === 78, "Math.atan2(Infinity, Infinity) = " + tmp); + +tmp = Math.atan2(Infinity, -Infinity, 1); +ok(Math.floor(tmp*100) === 235, "Math.atan2(Infinity, -Infinity, 1) = " + tmp); + +tmp = Math.atan2(); +ok(isNaN(tmp), "Math.atan2() is not NaN"); + +tmp = Math.atan2(1); +ok(isNaN(tmp), "Math.atan2(1) is not NaN"); + var func = function (a) { var a = 1; if(a) return;