Add unit tests for java.util.Calendar

and GregorianCalendar

Tests added for:
      Calendar.getWeekYear()
      Calendar.getWeeksInWeekYear()
      Calendar.isWeekDateSupported()
      Calendar.setWeekDate(int, int, int)
      GregorianCalendar.getWeekYear()
      GregorianCalendar.getWeeksInWeekYear()
      GregorianCalendar.isWeekDateSupported()
      GregorianCalendar.setWeekDate(int, int, int)

Bug: 27330986
(cherry-picked from commit 10a1d6caad617432420db593960829e47b38f761)
Change-Id: I24faf062ec966c097ba84a09292654d1e178e9a4
diff --git a/luni/src/test/java/libcore/java/util/CalendarTest.java b/luni/src/test/java/libcore/java/util/CalendarTest.java
index 20850cc..e1775a9 100644
--- a/luni/src/test/java/libcore/java/util/CalendarTest.java
+++ b/luni/src/test/java/libcore/java/util/CalendarTest.java
@@ -314,6 +314,31 @@
         assertEquals(1,calendar.get(Calendar.HOUR_OF_DAY));
     }
 
+    public void testGetWeekYear() {
+        try {
+            new FakeCalendar().getWeekYear();
+            fail();
+        } catch (UnsupportedOperationException expected) {}
+    }
+
+    public void testGetWeeksInWeekYear() {
+        try {
+            new FakeCalendar().getWeeksInWeekYear();
+            fail();
+        } catch (UnsupportedOperationException expected) {}
+    }
+
+    public void testIsWeekDateSupported() {
+        assertFalse(new FakeCalendar().isWeekDateSupported());
+    }
+
+    public void testSetWeekDate() {
+        try {
+            new FakeCalendar().setWeekDate(1, 1, 1);
+            fail();
+        } catch (UnsupportedOperationException expected) {}
+    }
+
     public static class FakeCalendar extends Calendar {
 
         private int[] subclassFields;
diff --git a/luni/src/test/java/libcore/java/util/GregorianCalendarTest.java b/luni/src/test/java/libcore/java/util/GregorianCalendarTest.java
index 4cb15ac..8b417f2 100644
--- a/luni/src/test/java/libcore/java/util/GregorianCalendarTest.java
+++ b/luni/src/test/java/libcore/java/util/GregorianCalendarTest.java
@@ -188,6 +188,85 @@
 
     }
 
+    public void test_isWeekDateSupported() {
+        assertTrue(new GregorianCalendar().isWeekDateSupported());
+    }
+
+    public void test_setWeekDate() {
+        GregorianCalendar cal = new GregorianCalendar();
+
+        // When first week should have at least 4 days
+        cal.setMinimalDaysInFirstWeek(4);
+        cal.setWeekDate(2016, 13, Calendar.TUESDAY);
+        assertEquals(Calendar.TUESDAY, cal.get(Calendar.DAY_OF_WEEK));
+        assertEquals(29, cal.get(Calendar.DAY_OF_MONTH));
+
+        // When first week can have single day
+        cal.setMinimalDaysInFirstWeek(1);
+        cal.setWeekDate(2016, 13, Calendar.TUESDAY);
+        assertEquals(Calendar.TUESDAY, cal.get(Calendar.DAY_OF_WEEK));
+        assertEquals(22, cal.get(Calendar.DAY_OF_MONTH));
+
+        try {
+            cal.setWeekDate(2016, 13, Calendar.SATURDAY + 1);
+            fail();
+        } catch (IllegalArgumentException expected) {
+        }
+
+        try {
+            cal.setWeekDate(2016, 13, Calendar.SUNDAY - 1);
+            fail();
+        } catch (IllegalArgumentException expected) {
+        }
+
+        // in non-lenient mode
+        cal.setLenient(false);
+        try {
+            cal.setWeekDate(2016, 60, Calendar.SATURDAY);
+            fail();
+        } catch (IllegalArgumentException expected) {}
+
+        try {
+            cal.setWeekDate(-1, 60, Calendar.SATURDAY);
+            fail();
+        } catch (IllegalArgumentException expected) {}
+    }
+
+    public void test_getWeekYear() {
+        GregorianCalendar cal = new GregorianCalendar();
+
+        cal.set(2016, Calendar.MARCH, 29);
+        assertEquals(2016, cal.getWeekYear());
+
+        // With minimal days in first week is set to 4
+        cal.setMinimalDaysInFirstWeek(4);
+        cal.set(2016, Calendar.JANUARY, 1);
+        assertEquals(2015, cal.getWeekYear());
+        cal.set(2015, Calendar.DECEMBER, 31);
+        assertEquals(2015, cal.getWeekYear());
+
+        // With minimal days in first week is set to 1
+        cal.setMinimalDaysInFirstWeek(1);
+        cal.set(2016, Calendar.JANUARY, 1);
+        assertEquals(2016, cal.getWeekYear());
+        cal.set(2015, Calendar.DECEMBER, 31);
+        assertEquals(2016, cal.getWeekYear());
+    }
+
+    public void test_getWeeksInWeekYear() {
+        GregorianCalendar cal = new GregorianCalendar();
+
+        // With minimal days in first week is set to 1
+        cal.setMinimalDaysInFirstWeek(1);
+        cal.set(2016, Calendar.JANUARY, 10);
+        assertEquals(53, cal.getWeeksInWeekYear());
+
+        // With minimal days in first week is set to 4
+        cal.setMinimalDaysInFirstWeek(4);
+        cal.set(2016, Calendar.JANUARY, 10);
+        assertEquals(52, cal.getWeeksInWeekYear());
+    }
+
     private long getDstLosAngeles2014(TimeZone timeZone) {
         GregorianCalendar cal = new GregorianCalendar(timeZone, Locale.ENGLISH);
         cal.set(Calendar.MILLISECOND, 0);