diff --git a/dlls/jscript/math.c b/dlls/jscript/math.c index a2aa6a9a7da..2bcf5ad8c26 100644 --- a/dlls/jscript/math.c +++ b/dlls/jscript/math.c @@ -236,11 +236,27 @@ static HRESULT Math_random(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS return E_NOTIMPL; } +/* ECMA-262 3rd Edition 15.8.2.15 */ static HRESULT Math_round(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) { - FIXME("\n"); - return E_NOTIMPL; + VARIANT v; + HRESULT hres; + + TRACE("\n"); + + if(!arg_cnt(dp)) { + FIXME("arg_cnt = 0\n"); + return E_NOTIMPL; + } + + hres = to_number(dispex->ctx, get_arg(dp, 0), ei, &v); + if(FAILED(hres)) + return hres; + + if(retv) + num_set_val(retv, floor(num_val(&v)+0.5)); + return S_OK; } static HRESULT Math_sin(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, diff --git a/dlls/jscript/tests/api.js b/dlls/jscript/tests/api.js index 93f131d855f..34a6456a3e9 100644 --- a/dlls/jscript/tests/api.js +++ b/dlls/jscript/tests/api.js @@ -255,4 +255,19 @@ ok(tmp === 0, "Math.min(1, false) = " + tmp); tmp = Math.min(1, false, true, null, -3); ok(tmp === -3, "Math.min(1, false, true, null, -3) = " + tmp); +tmp = Math.round(0.5); +ok(tmp === 1, "Math.round(0.5) = " + tmp); + +tmp = Math.round(-0.5); +ok(tmp === 0, "Math.round(-0.5) = " + tmp); + +tmp = Math.round(1.1); +ok(tmp === 1, "Math.round(1.1) = " + tmp); + +tmp = Math.round(true); +ok(tmp === 1, "Math.round(true) = " + tmp); + +tmp = Math.round(1.1, 3, 4); +ok(tmp === 1, "Math.round(1.1, 3, 4) = " + tmp); + reportSuccess();