You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by li...@apache.org on 2007/01/10 10:06:42 UTC

svn commit: r494772 - in /harmony/enhanced/classlib/trunk/modules/luni/src: main/java/java/util/GregorianCalendar.java test/java/tests/api/java/util/GregorianCalendarTest.java

Author: liangyx
Date: Wed Jan 10 01:06:41 2007
New Revision: 494772

URL: http://svn.apache.org/viewvc?view=rev&rev=494772
Log:
Apply patch for HARMONY-2954 ([classlib][luni]GregorianCalendar.getActualMaximum(Calendar.DAY_OF_YEAR) returns incorrect value)

Modified:
    harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/util/GregorianCalendar.java
    harmony/enhanced/classlib/trunk/modules/luni/src/test/java/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=494772&r1=494771&r2=494772
==============================================================================
--- 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 Wed Jan 10 01:06:41 2007
@@ -74,6 +74,10 @@
 
     private long lastMidnightMillis = 0L;
 
+    private int currentYearSkew = 10;
+
+    private int lastYearSkew = 0;
+
     /**
      * Constructs a new GregorianCalendar initialized to the current date and
      * time.
@@ -796,7 +800,14 @@
     }
 
     private int daysInYear() {
-        return isLeapYear(fields[YEAR]) ? 366 : 365;
+        int daysInYear = isLeapYear(fields[YEAR]) ? 366 : 365;
+        if (fields[YEAR] == changeYear) {
+            daysInYear -= currentYearSkew;
+        }
+        if (fields[YEAR] == changeYear - 1) {
+            daysInYear -= lastYearSkew;
+        }
+        return daysInYear;
     }
 
     private int daysInYear(boolean leapYear, int month) {
@@ -1204,6 +1215,15 @@
         }
         julianSkew = ((changeYear - 2000) / 400) + julianError()
                 - ((changeYear - 2000) / 100);
+        isCached = false;
+        int dayOfYear = cal.get(DAY_OF_YEAR);
+        if (dayOfYear < julianSkew) {
+            currentYearSkew = dayOfYear;
+            lastYearSkew = julianSkew - dayOfYear;
+        } else {
+            lastYearSkew = 0;
+            currentYearSkew = julianSkew;
+        }
         isCached = false;
     }
 

Modified: harmony/enhanced/classlib/trunk/modules/luni/src/test/java/tests/api/java/util/GregorianCalendarTest.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/luni/src/test/java/tests/api/java/util/GregorianCalendarTest.java?view=diff&rev=494772&r1=494771&r2=494772
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/luni/src/test/java/tests/api/java/util/GregorianCalendarTest.java (original)
+++ harmony/enhanced/classlib/trunk/modules/luni/src/test/java/tests/api/java/util/GregorianCalendarTest.java Wed Jan 10 01:06:41 2007
@@ -296,6 +296,16 @@
 				.getActualMaximum(Calendar.HOUR));
 		assertEquals("Wrong actual maximum value for DAY_OF_WEEK_IN_MONTH", 4, gc6
 				.getActualMaximum(Calendar.DAY_OF_WEEK_IN_MONTH));
+        
+        
+        // Regression test for harmony 2954
+        Date date = new Date(Date.parse("Jan 15 00:00:01 GMT 2000"));
+        GregorianCalendar gc = new GregorianCalendar();
+        gc.setTimeInMillis(Date.parse("Dec 15 00:00:01 GMT 1582"));
+        assertEquals(355, gc.getActualMaximum(Calendar.DAY_OF_YEAR)); 
+        gc.setGregorianChange(date);
+        gc.setTimeInMillis(Date.parse("Jan 16 00:00:01 GMT 2000"));
+        assertEquals(353, gc.getActualMaximum(Calendar.DAY_OF_YEAR)); 
 	}
 
 	/**