From 9edae36b0053a976f679568dc12d78de2207f363 Mon Sep 17 00:00:00 2001 From: Szilard Ledan Date: Thu, 16 Jul 2015 18:43:52 +0200 Subject: [PATCH] Fix assertion fail in ecma_date_make_day JerryScript-DCO-1.0-Signed-off-by: Szilard Ledan szledan.u-szeged@partner.samsung.com --- .../ecma-builtin-helpers-date.cpp | 19 +++++--- tests/jerry/date-getters.js | 9 ++++ tests/unit/test-date-helpers.cpp | 43 ++++++++++++++++--- 3 files changed, 58 insertions(+), 13 deletions(-) diff --git a/jerry-core/ecma/builtin-objects/ecma-builtin-helpers-date.cpp b/jerry-core/ecma/builtin-objects/ecma-builtin-helpers-date.cpp index 1b99d69f3..511e619d8 100644 --- a/jerry-core/ecma/builtin-objects/ecma-builtin-helpers-date.cpp +++ b/jerry-core/ecma/builtin-objects/ecma-builtin-helpers-date.cpp @@ -548,8 +548,9 @@ ecma_date_hour_from_time (ecma_number_t time) /**< time value */ return time; /* time is NaN */ } - return (ecma_number_t) fmod (floor (time / ECMA_DATE_MS_PER_HOUR), - ECMA_DATE_HOURS_PER_DAY); + ecma_number_t hour = (ecma_number_t) fmod (floor (time / ECMA_DATE_MS_PER_HOUR), + ECMA_DATE_HOURS_PER_DAY); + return (hour < 0) ? ECMA_DATE_HOURS_PER_DAY + hour : hour; } /* ecma_date_hour_from_time */ /** @@ -578,8 +579,9 @@ ecma_date_min_from_time (ecma_number_t time) /**< time value */ return time; /* time is NaN */ } - return (ecma_number_t) fmod (floor (time / ECMA_DATE_MS_PER_MINUTE), - ECMA_DATE_MINUTES_PER_HOUR); + ecma_number_t min = (ecma_number_t) fmod (floor (time / ECMA_DATE_MS_PER_MINUTE), + ECMA_DATE_MINUTES_PER_HOUR); + return (min < 0) ? ECMA_DATE_MINUTES_PER_HOUR + min : min; } /* ecma_date_min_from_time */ /** @@ -608,8 +610,9 @@ ecma_date_sec_from_time (ecma_number_t time) /**< time value */ return time; /* time is NaN */ } - return (ecma_number_t) fmod (floor (time / ECMA_DATE_MS_PER_SECOND), - ECMA_DATE_SECONDS_PER_MINUTE); + ecma_number_t sec = (ecma_number_t) fmod (floor (time / ECMA_DATE_MS_PER_SECOND), + ECMA_DATE_SECONDS_PER_MINUTE); + return (sec < 0) ? ECMA_DATE_SECONDS_PER_MINUTE + sec : sec; } /* ecma_date_sec_from_time */ /** @@ -638,7 +641,8 @@ ecma_date_ms_from_time (ecma_number_t time) /**< time value */ return time; /* time is NaN */ } - return (ecma_number_t) fmod (time, ECMA_DATE_MS_PER_SECOND); + ecma_number_t milli = (ecma_number_t) fmod (time, ECMA_DATE_MS_PER_SECOND); + return (milli < 0) ? ECMA_DATE_MS_PER_SECOND + milli : milli; } /* ecma_date_ms_from_time */ /** @@ -725,6 +729,7 @@ ecma_date_make_day (ecma_number_t year, /**< year value */ ecma_number_t dt = ecma_number_trunc (date); ecma_number_t ym = y + (ecma_number_t) floor (m / 12); ecma_number_t mn = (ecma_number_t) fmod (m, 12); + mn = (mn < 0) ? 12 + mn : mn; ecma_number_t time = ecma_date_time_from_year (ym); JERRY_ASSERT (ecma_date_year_from_time (time) == ym); diff --git a/tests/jerry/date-getters.js b/tests/jerry/date-getters.js index 81b2cd749..0d1c45c02 100644 --- a/tests/jerry/date-getters.js +++ b/tests/jerry/date-getters.js @@ -98,3 +98,12 @@ assert (isNaN (d.getMilliseconds())); assert (isNaN (d.getUTCMilliseconds())); assert (isNaN (d.getTimezoneOffset())); +/* 5. test case */ +assert (new Date(2013, -1).getMonth() === 11); +assert (new Date(-1, -1).getFullYear() === -2); +assert (new Date(-1, -1, -1).getMonth() === 10); +assert (new Date(-1, -1, -1, -1).getDate() === 28); +assert (new Date(-1, -1, -1, -1, -1).getHours() === 22); +assert (new Date(-1, -1, -1, -1, -1, -1).getMinutes() === 58); +assert (new Date(-1, -1, -1, -1, -1, -1, -1).getSeconds() === 58); +assert (new Date(-1, -1, -1, -1, -1, -1, -1, -1).getMilliseconds() === 999); diff --git a/tests/unit/test-date-helpers.cpp b/tests/unit/test-date-helpers.cpp index 877c6ad48..4c823f19a 100644 --- a/tests/unit/test-date-helpers.cpp +++ b/tests/unit/test-date-helpers.cpp @@ -19,6 +19,13 @@ #include "ecma-helpers.h" #define MS_PER_DAY ((ecma_number_t) 86400000) +#define MS_PER_YEAR ((ecma_number_t) 365 * MS_PER_DAY) +#define START_OF_GREGORIAN_CALENDAR ((ecma_number_t) (-1970 * MS_PER_YEAR \ + - (1970 / 4) * MS_PER_DAY \ + + (1970 / 100) * MS_PER_DAY \ + - (1970 / 400) * MS_PER_DAY \ + - MS_PER_DAY)) + /** * Unit test's main function. */ @@ -61,6 +68,7 @@ main (int __attr_unused___ argc, /* int ecma_date_year_from_time (time) */ + JERRY_ASSERT (ecma_date_year_from_time (0) == 1970); JERRY_ASSERT (ecma_date_year_from_time (0) == 1970); JERRY_ASSERT (ecma_date_year_from_time (MS_PER_DAY) == 1970); JERRY_ASSERT (ecma_date_year_from_time ((MS_PER_DAY) * (ecma_number_t) 365 - 1) == 1970); @@ -69,6 +77,10 @@ main (int __attr_unused___ argc, == 2014); JERRY_ASSERT (ecma_date_year_from_time (MS_PER_DAY * (ecma_number_t) (365.25 * (2015 - 1970))) == 2015); + JERRY_ASSERT (ecma_date_year_from_time (-MS_PER_YEAR) == 1969); + JERRY_ASSERT (ecma_date_year_from_time (-1970 * MS_PER_YEAR) == 1); + JERRY_ASSERT (ecma_date_year_from_time (START_OF_GREGORIAN_CALENDAR) == 0); + JERRY_ASSERT (ecma_date_year_from_time (START_OF_GREGORIAN_CALENDAR - 1) == -1); /* int ecma_date_day_within_year (time) */ @@ -76,11 +88,17 @@ main (int __attr_unused___ argc, /* int ecma_date_month_from_time (time) */ - /* FIXME: Implement */ + JERRY_ASSERT (ecma_date_month_from_time (START_OF_GREGORIAN_CALENDAR) == 0); + JERRY_ASSERT (ecma_date_month_from_time (0) == 0); + JERRY_ASSERT (ecma_date_month_from_time (-MS_PER_DAY) == 11); + JERRY_ASSERT (ecma_date_month_from_time (31 * MS_PER_DAY) == 1); /* int ecma_date_date_from_time (time) */ - /* FIXME: Implement */ + JERRY_ASSERT (ecma_date_date_from_time (START_OF_GREGORIAN_CALENDAR) == 1); + JERRY_ASSERT (ecma_date_date_from_time (0) == 1); + JERRY_ASSERT (ecma_date_date_from_time (-MS_PER_DAY) == 31); + JERRY_ASSERT (ecma_date_date_from_time (31 * MS_PER_DAY) == 1); /* int ecma_date_week_day (ecma_number_t time) */ @@ -104,19 +122,31 @@ main (int __attr_unused___ argc, /* ecma_number_t ecma_date_hour_from_time (time) */ - /* FIXME: Implement */ + JERRY_ASSERT (ecma_date_hour_from_time (START_OF_GREGORIAN_CALENDAR) == 0); + JERRY_ASSERT (ecma_date_hour_from_time (0) == 0); + JERRY_ASSERT (ecma_date_hour_from_time (-MS_PER_DAY) == 0); + JERRY_ASSERT (ecma_date_hour_from_time (-1) == 23); /* ecma_number_t ecma_date_min_from_time (time) */ - /* FIXME: Implement */ + JERRY_ASSERT (ecma_date_min_from_time (START_OF_GREGORIAN_CALENDAR) == 0); + JERRY_ASSERT (ecma_date_min_from_time (0) == 0); + JERRY_ASSERT (ecma_date_min_from_time (-MS_PER_DAY) == 0); + JERRY_ASSERT (ecma_date_min_from_time (-1) == 59); /* ecma_number_t ecma_date_sec_from_time (time) */ - /* FIXME: Implement */ + JERRY_ASSERT (ecma_date_sec_from_time (START_OF_GREGORIAN_CALENDAR) == 0); + JERRY_ASSERT (ecma_date_sec_from_time (0) == 0); + JERRY_ASSERT (ecma_date_sec_from_time (-MS_PER_DAY) == 0); + JERRY_ASSERT (ecma_date_sec_from_time (-1) == 59); /* ecma_number_t ecma_date_ms_from_time (time) */ - /* FIXME: Implement */ + JERRY_ASSERT (ecma_date_ms_from_time (START_OF_GREGORIAN_CALENDAR) == 0); + JERRY_ASSERT (ecma_date_ms_from_time (0) == 0); + JERRY_ASSERT (ecma_date_ms_from_time (-MS_PER_DAY) == 0); + JERRY_ASSERT (ecma_date_ms_from_time (-1) == 999); /* ecma_number_t ecma_date_make_time (hour, min, sec, ms) */ @@ -125,6 +155,7 @@ main (int __attr_unused___ argc, /* ecma_number_t ecma_date_make_day (year, month, date) */ JERRY_ASSERT (ecma_date_make_day (1970, 0, 1) == 0); + JERRY_ASSERT (ecma_date_make_day (1970, -1, 1) == -31); JERRY_ASSERT (ecma_date_make_day (1970, 0, 2.5) == 1); JERRY_ASSERT (ecma_date_make_day (1970, 1, 35) == 65); JERRY_ASSERT (ecma_date_make_day (1970, 13, 35) == 430);