You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by to...@apache.org on 2007/07/22 06:30:03 UTC
svn commit: r558462 - in /harmony/enhanced/classlib/trunk/modules/luni/src:
main/java/java/util/GregorianCalendar.java
test/api/common/tests/api/java/util/GregorianCalendarTest.java
Author: tonywu
Date: Sat Jul 21 21:30:01 2007
New Revision: 558462
URL: http://svn.apache.org/viewvc?view=rev&rev=558462
Log:
Fix Harmony-4510 ([classlib][luni][regression] GregorianCalendar.roll works incorrectly)
Modified:
harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/util/GregorianCalendar.java
harmony/enhanced/classlib/trunk/modules/luni/src/test/api/common/tests/api/java/util/GregorianCalendarTest.java
Modified: harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/util/GregorianCalendar.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/util/GregorianCalendar.java?view=diff&rev=558462&r1=558461&r2=558462
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/util/GregorianCalendar.java (original)
+++ harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/util/GregorianCalendar.java Sat Jul 21 21:30:01 2007
@@ -1133,73 +1133,90 @@
isCached = false;
complete();
+ int days, day, mod, maxWeeks, newWeek;
int max = -1;
switch (field) {
- case YEAR:
- max = maximums[field];
- break;
- case WEEK_OF_YEAR:
- case WEEK_OF_MONTH:
- int days,
- day;
- if (field == WEEK_OF_YEAR) {
- days = daysInYear(fields[YEAR]);
- day = DAY_OF_YEAR;
+ case YEAR:
+ max = maximums[field];
+ break;
+ case WEEK_OF_YEAR:
+ days = daysInYear(fields[YEAR]);
+ day = DAY_OF_YEAR;
+ mod = mod7(fields[DAY_OF_WEEK] - fields[day]
+ - (getFirstDayOfWeek() - 1));
+ maxWeeks = (days - 1 + mod) / 7 + 1;
+ newWeek = mod(fields[field] - 1 + value, maxWeeks) + 1;
+ if (newWeek == maxWeeks) {
+ int addDays = (newWeek - fields[field]) * 7;
+ if (fields[day] > addDays && fields[day] + addDays > days) {
+ set(field, 1);
} else {
- days = daysInMonth();
- day = DATE;
+ set(field, newWeek - 1);
}
- int mod = mod7(fields[DAY_OF_WEEK] - fields[day]
- - (getFirstDayOfWeek() - 1));
- int maxWeeks = (days - 1 + mod) / 7 + 1;
- int newWeek = mod(fields[field] - 1 + value, maxWeeks) + 1;
- if (newWeek == maxWeeks) {
- int addDays = (newWeek - fields[field]) * 7;
- if (fields[day] > addDays && fields[day] + addDays > days) {
- set(field, 1);
- } else {
- set(field, newWeek - 1);
- }
- } else if (newWeek == 1) {
- int week = (fields[day] - ((fields[day] - 1) / 7 * 7) - 1 + mod) / 7 + 1;
- if (week > 1) {
- set(field, 1);
- } else {
- set(field, newWeek);
- }
+ } else if (newWeek == 1) {
+ int week = (fields[day] - ((fields[day] - 1) / 7 * 7) - 1 + mod) / 7 + 1;
+ if (week > 1) {
+ set(field, 1);
} else {
set(field, newWeek);
}
- break;
- case DATE:
- max = daysInMonth();
- break;
- case DAY_OF_YEAR:
- max = daysInYear(fields[YEAR]);
- break;
- case DAY_OF_WEEK:
- max = maximums[field];
- lastDateFieldSet = WEEK_OF_MONTH;
- break;
- case DAY_OF_WEEK_IN_MONTH:
- max = (fields[DATE] + ((daysInMonth() - fields[DATE]) / 7 * 7) - 1) / 7 + 1;
- break;
-
- case ERA:
- case MONTH:
- case AM_PM:
- case HOUR:
- case HOUR_OF_DAY:
- case MINUTE:
- case SECOND:
- case MILLISECOND:
- set(field, mod(fields[field] + value, maximums[field] + 1));
- if (field == MONTH && fields[DATE] > daysInMonth()) {
- set(DATE, daysInMonth());
- } else if (field == AM_PM) {
- lastTimeFieldSet = HOUR;
+ } else {
+ set(field, newWeek);
+ }
+ break;
+ case WEEK_OF_MONTH:
+ days = daysInMonth();
+ day = DATE;
+ mod = mod7(fields[DAY_OF_WEEK] - fields[day]
+ - (getFirstDayOfWeek() - 1));
+ maxWeeks = (days - 1 + mod) / 7 + 1;
+ newWeek = mod(fields[field] - 1 + value, maxWeeks) + 1;
+ if (newWeek == maxWeeks) {
+ if (fields[day] + (newWeek - fields[field]) * 7 > days) {
+ set(day, days);
+ } else {
+ set(field, newWeek);
}
- break;
+ } else if (newWeek == 1) {
+ int week = (fields[day] - ((fields[day] - 1) / 7 * 7) - 1 + mod) / 7 + 1;
+ if (week > 1) {
+ set(day, 1);
+ } else {
+ set(field, newWeek);
+ }
+ } else {
+ set(field, newWeek);
+ }
+ break;
+ case DATE:
+ max = daysInMonth();
+ break;
+ case DAY_OF_YEAR:
+ max = daysInYear(fields[YEAR]);
+ break;
+ case DAY_OF_WEEK:
+ max = maximums[field];
+ lastDateFieldSet = WEEK_OF_MONTH;
+ break;
+ case DAY_OF_WEEK_IN_MONTH:
+ max = (fields[DATE] + ((daysInMonth() - fields[DATE]) / 7 * 7) - 1) / 7 + 1;
+ break;
+
+ case ERA:
+ case MONTH:
+ case AM_PM:
+ case HOUR:
+ case HOUR_OF_DAY:
+ case MINUTE:
+ case SECOND:
+ case MILLISECOND:
+ set(field, mod(fields[field] + value, maximums[field] + 1));
+ if (field == MONTH && fields[DATE] > daysInMonth()) {
+ set(DATE, daysInMonth());
+ } else if (field == AM_PM) {
+ lastTimeFieldSet = HOUR;
+ }
+ break;
}
if (max != -1) {
set(field, mod(fields[field] - 1 + value, max) + 1);
Modified: harmony/enhanced/classlib/trunk/modules/luni/src/test/api/common/tests/api/java/util/GregorianCalendarTest.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/luni/src/test/api/common/tests/api/java/util/GregorianCalendarTest.java?view=diff&rev=558462&r1=558461&r2=558462
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/luni/src/test/api/common/tests/api/java/util/GregorianCalendarTest.java (original)
+++ harmony/enhanced/classlib/trunk/modules/luni/src/test/api/common/tests/api/java/util/GregorianCalendarTest.java Sat Jul 21 21:30:01 2007
@@ -604,6 +604,21 @@
assertEquals("Wrong month: " + cal.getTime(), Calendar.DECEMBER, cal
.get(Calendar.MONTH));
assertEquals("Wrong date: " + cal.getTime(), 23, cal.get(Calendar.DATE));
+
+ // Regression for HARMONY-4510
+ cal.set(1999, Calendar.DECEMBER, 31, 23, 59, 59);
+ cal.roll(GregorianCalendar.WEEK_OF_YEAR, true);
+ assertEquals("Wrong year: " + cal.getTime(), 1999, cal
+ .get(Calendar.YEAR));
+ assertEquals("Wrong month: " + cal.getTime(), Calendar.JANUARY, cal
+ .get(Calendar.MONTH));
+ assertEquals("Wrong date: " + cal.getTime(), 8, cal.get(Calendar.DATE));
+ cal.roll(GregorianCalendar.WEEK_OF_YEAR, false);
+ assertEquals("Wrong year: " + cal.getTime(), 1999, cal
+ .get(Calendar.YEAR));
+ assertEquals("Wrong month: " + cal.getTime(), Calendar.DECEMBER, cal
+ .get(Calendar.MONTH));
+ assertEquals("Wrong date: " + cal.getTime(), 31, cal.get(Calendar.DATE));
}
/**