diff --git a/dlls/jscript/date.c b/dlls/jscript/date.c index 4c377eb4c9c..89ec7b2d7cf 100644 --- a/dlls/jscript/date.c +++ b/dlls/jscript/date.c @@ -98,6 +98,18 @@ static inline DOUBLE day(DOUBLE time) return floor(time / MS_PER_DAY); } +/* ECMA-262 3rd Edition 15.9.1.2 */ +static inline DOUBLE time_within_day(DOUBLE time) +{ + DOUBLE ret; + + ret = fmod(time, MS_PER_DAY); + if(ret < 0) + ret += MS_PER_DAY; + + return ret; +} + /* ECMA-262 3rd Edition 15.9.1.3 */ static inline DOUBLE days_in_year(DOUBLE year) { @@ -1289,16 +1301,76 @@ static HRESULT Date_setUTCHours(DispatchEx *dispex, LCID lcid, WORD flags, DISPP static HRESULT Date_setDate(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) { - FIXME("\n"); - return E_NOTIMPL; + VARIANT v; + HRESULT hres; + DateInstance *date; + DOUBLE t; + + TRACE("\n"); + + if(!is_class(dispex, JSCLASS_DATE)) { + FIXME("throw TypeError\n"); + return E_FAIL; + } + + if(!arg_cnt(dp)) { + FIXME("throw ArgumentNotOptional\n"); + if(retv) num_set_nan(retv); + return S_OK; + } + + hres = to_number(dispex->ctx, get_arg(dp, 0), ei, &v); + if(FAILED(hres)) + return hres; + + date = (DateInstance*)dispex; + t = local_time(date->time, date); + t = make_date(make_day(year_from_time(t), month_from_time(t), + num_val(&v)), time_within_day(t)); + date->time = time_clip(utc(t, date)); + + if(retv) + num_set_val(retv, date->time); + + return S_OK; } /* ECMA-262 3rd Edition 15.9.5.37 */ static HRESULT Date_setUTCDate(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) { - FIXME("\n"); - return E_NOTIMPL; + VARIANT v; + HRESULT hres; + DateInstance *date; + DOUBLE t; + + TRACE("\n"); + + if(!is_class(dispex, JSCLASS_DATE)) { + FIXME("throw TypeError\n"); + return E_FAIL; + } + + if(!arg_cnt(dp)) { + FIXME("throw ArgumentNotOptional\n"); + if(retv) num_set_nan(retv); + return S_OK; + } + + hres = to_number(dispex->ctx, get_arg(dp, 0), ei, &v); + if(FAILED(hres)) + return hres; + + date = (DateInstance*)dispex; + t = date->time; + t = make_date(make_day(year_from_time(t), month_from_time(t), + num_val(&v)), time_within_day(t)); + date->time = time_clip(t); + + if(retv) + num_set_val(retv, date->time); + + return S_OK; } static HRESULT Date_setMonth(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, diff --git a/dlls/jscript/tests/api.js b/dlls/jscript/tests/api.js index a865e9f394f..36eb85bdab8 100644 --- a/dlls/jscript/tests/api.js +++ b/dlls/jscript/tests/api.js @@ -1001,22 +1001,22 @@ ok(isNaN(date.getUTCMilliseconds()), "date.getUTCMilliseconds() is not NaN"); ok(isNaN(date.setMilliseconds(0)), "date.setMilliseconds() is not NaN"); date.setTime(0); -date.setMilliseconds(-10, 2); +date.setUTCMilliseconds(-10, 2); ok(date.getUTCMilliseconds() === 990, "date.getUTCMilliseconds() = " + date.getUTCMilliseconds()); date.setUTCMilliseconds(10); ok(date.getUTCMilliseconds() === 10, "date.getUTCMilliseconds() = " + date.getUTCMilliseconds()); -date.setSeconds(-10); +date.setUTCSeconds(-10); ok(date.getUTCSeconds() === 50, "date.getUTCSeconds() = " + date.getUTCSeconds()); -ok(date.setSeconds(10) === date.setUTCSeconds(10), "date.setUTCSeconds(10) !== date.setUTCSeconds(10)"); -date.setMinutes(-10); +date.setUTCMinutes(-10); ok(date.getUTCMinutes() === 50, "date.getUTCMinutes() = " + date.getUTCMinutes()); -ok(date.setMinutes(10) === date.setUTCMinutes(10), "date.setUTCMinutes(10) !== date.setUTCMinutes(10)"); date.setUTCHours(-10); ok(date.getUTCHours() === 14, "date.getUTCHours() = " + date.getUTCHours()); date.setUTCHours(-123); -ok(date.getTime() === -614989990, "date.getTime() = " + date.getTime()); -date.setHours(20); -ok(date.getHours() === 20, "date.getHours() = " + date.getHours()); +ok(date.getTime() === -612549990, "date.getTime() = " + date.getTime()); +date.setUTCHours(20); +ok(date.getUTCHours() === 20, "date.getUTCHours() = " + date.getUTCHours()); +date.setUTCDate(32); +ok(date.getUTCDate() === 1, "date.getUTCDate() = " + date.getUTCDate()); ok(typeof(Math.PI) === "number", "typeof(Math.PI) = " + typeof(Math.PI)); ok(Math.floor(Math.PI*100) === 314, "Math.PI = " + Math.PI);