You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by te...@apache.org on 2007/06/18 15:53:51 UTC

svn commit: r548357 - in /harmony/enhanced/classlib/branches/java6/modules/luni/src: main/java/java/util/Calendar.java test/java/tests/api/java/util/CalendarTest.java

Author: tellison
Date: Mon Jun 18 06:53:50 2007
New Revision: 548357

URL: http://svn.apache.org/viewvc?view=rev&rev=548357
Log:
Apply patch HARMONY-4200 ([classlib][luni][java6] New fields/methods in java.util.Calendar for java6)

Modified:
    harmony/enhanced/classlib/branches/java6/modules/luni/src/main/java/java/util/Calendar.java
    harmony/enhanced/classlib/branches/java6/modules/luni/src/test/java/tests/api/java/util/CalendarTest.java

Modified: harmony/enhanced/classlib/branches/java6/modules/luni/src/main/java/java/util/Calendar.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/luni/src/main/java/java/util/Calendar.java?view=diff&rev=548357&r1=548356&r2=548357
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/luni/src/main/java/java/util/Calendar.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/luni/src/main/java/java/util/Calendar.java Mon Jun 18 06:53:50 2007
@@ -23,6 +23,7 @@
 import java.io.ObjectOutputStream;
 import java.io.ObjectStreamField;
 import java.io.Serializable;
+import java.text.DateFormatSymbols;
 
 /**
  * Calendar is an abstract class which provides the conversion between Dates and
@@ -63,10 +64,36 @@
 	protected boolean isTimeSet;
 
 	/**
+	 * A specifier for all styles.
+	 * 
+	 * @since 1.6
+	 */
+	public static final int ALL_STYLES = 0;
+
+	/**
+	 * A specifier for a short name
+	 * 
+	 * @since 1.6
+	 */
+	public static final int SHORT = 1;
+
+	/**
+	 * A specifier for a long name
+	 * 
+	 * @since 1.6
+	 */
+	public static final int LONG = 2;
+
+	/**
 	 * The time in milliseconds since January 1, 1970.
 	 */
 	protected long time;
 
+	/**
+	 * The version of the serialized data of the class
+	 */
+	int serialVersionOnStream = 1;
+
 	transient int lastTimeFieldSet;
 
 	transient int lastDateFieldSet;
@@ -797,6 +824,149 @@
 			return 0;
 		}
 		return -1;
+	}
+
+	/**
+	 * answers the display name for given field, style and locale
+	 * 
+	 * @param field
+	 *            the field of the calendar
+	 * @param style
+	 *            the style of the name
+	 * @param locale
+	 *            the locale to use
+	 * @return the display name
+	 * @since 1.6
+	 */
+	public String getDisplayName(int field, int style, Locale locale) {
+		if (field < 0 || field >= FIELD_COUNT) {
+			throw new IllegalArgumentException();
+		}
+		if (ALL_STYLES == style) {
+			if (!lenient) {
+				throw new IllegalArgumentException();
+			}
+			style = SHORT;
+		}
+		if (SHORT != style && LONG != style) {
+			throw new IllegalArgumentException();
+		}
+		DateFormatSymbols symbol = new DateFormatSymbols(locale);
+		int fid = get(field);
+		switch (field) {
+		case MONTH:
+			return (LONG == style ? symbol.getMonths()[fid] : symbol
+					.getShortMonths()[fid]);
+		case DAY_OF_WEEK:
+			return (LONG == style ? symbol.getWeekdays()[fid] : symbol
+					.getShortWeekdays()[fid]);
+		case AM_PM:
+			return symbol.getAmPmStrings()[fid];
+		case ERA:
+			return symbol.getEras()[fid];
+		default:
+			return null;
+		}
+	}
+
+	/**
+	 * answers a map of display names for given field, style and locale
+	 * 
+	 * @param field
+	 *            the field of the calendar
+	 * @param style
+	 *            the style of the name
+	 * @param locale
+	 *            the locale to use
+	 * @return a map of display names
+	 * @since 1.6
+	 */
+	public Map<String, Integer> getDisplayNames(int field, int style,
+			Locale locale) {
+		if (field < 0 || field >= FIELD_COUNT) {
+			throw new IllegalArgumentException();
+		}
+		if (ALL_STYLES != style && SHORT != style && LONG != style) {
+			throw new IllegalArgumentException();
+		}
+		complete();
+		DateFormatSymbols symbol = new DateFormatSymbols(locale);
+		Map<String, Integer> ret = new HashMap<String, Integer>();
+		switch (field) {
+		case MONTH:
+			String[] months;
+			switch (style) {
+			case LONG:
+				months = symbol.getMonths();
+				break;
+			case SHORT:
+				months = symbol.getShortMonths();
+				break;
+			case ALL_STYLES:
+				months = symbol.getMonths();
+				for (int i = 0; i < months.length; i++) {
+					if (!months[i].equals("") && months[i] != null) {
+						ret.put(months[i], i);
+					}
+				}
+				months = symbol.getShortMonths();
+				break;
+			default:
+				throw new IllegalArgumentException();
+			}
+			for (int i = 0; i < months.length; i++) {
+				if (!months[i].equals("") && months[i] != null) {
+					ret.put(months[i], i);
+				}
+			}
+			break;
+		case DAY_OF_WEEK:
+			String[] weekDays;
+			switch (style) {
+			case LONG:
+				weekDays = symbol.getWeekdays();
+				break;
+			case SHORT:
+				weekDays = symbol.getShortWeekdays();
+				break;
+			case ALL_STYLES:
+				weekDays = symbol.getWeekdays();
+				for (int i = 0; i < weekDays.length; i++) {
+					if (!weekDays[i].equals("") && weekDays[i] != null) {
+						ret.put(weekDays[i], i);
+					}
+				}
+				weekDays = symbol.getWeekdays();
+				break;
+			default:
+				throw new IllegalArgumentException();
+			}
+			for (int i = 0; i < weekDays.length; i++) {
+				if (!weekDays[i].equals("") && weekDays[i] != null) {
+					ret.put(weekDays[i], i);
+				}
+			}
+			break;
+		case AM_PM:
+			String[] amPms = symbol.getAmPmStrings();
+			for (int i = 0; i < amPms.length; i++) {
+				if (!amPms[i].equals("") && amPms[i] != null) {
+					ret.put(amPms[i], i);
+				}
+			}
+			break;
+		case ERA:
+			String[] eras = symbol.getEras();
+			for (int i = 0; i < eras.length; i++) {
+				if (!eras[i].equals("") && eras[i] != null) {
+					ret.put(eras[i], i);
+				}
+			}
+			break;
+		default:
+			ret = null;
+		}
+		return ret;
 	}
 
 	private static final ObjectStreamField[] serialPersistentFields = {

Modified: harmony/enhanced/classlib/branches/java6/modules/luni/src/test/java/tests/api/java/util/CalendarTest.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/luni/src/test/java/tests/api/java/util/CalendarTest.java?view=diff&rev=548357&r1=548356&r2=548357
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/luni/src/test/java/tests/api/java/util/CalendarTest.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/luni/src/test/java/tests/api/java/util/CalendarTest.java Mon Jun 18 06:53:50 2007
@@ -17,9 +17,14 @@
 
 package tests.api.java.util;
 
+import java.text.DateFormatSymbols;
+import java.util.ArrayList;
 import java.util.Calendar;
 import java.util.Date;
+import java.util.GregorianCalendar;
+import java.util.List;
 import java.util.Locale;
+import java.util.Map;
 import java.util.TimeZone;
 
 public class CalendarTest extends junit.framework.TestCase {
@@ -449,7 +454,7 @@
         Calendar cal = Calendar.getInstance();
 
         int year = Integer.MIN_VALUE + 71;
-        cal.setTimeZone(TimeZone.getTimeZone("GMT"));;
+		cal.setTimeZone(TimeZone.getTimeZone("GMT"));
         cal.set(Calendar.YEAR, year + 1900);
         cal.set(Calendar.MONTH, Calendar.JANUARY);
         cal.set(Calendar.DATE, 1);
@@ -461,22 +466,10 @@
         assertEquals(6017546357372606464L, cal.getTimeInMillis());
     }
 
-    /**
-     * @tests {@link java.util.Calendar#getActualMaximum(int)}
-     */
-    public void test_getActualMaximum_I() {
-    	Calendar c = new MockCalendar();
-    	assertEquals("should be equal to 0", 0, c.getActualMaximum(0));
-    }
-    
-    /**
-     * @tests {@link java.util.Calendar#getActualMinimum(int)}
-     */
-    public void test_getActualMinimum_I() {
-    	Calendar c = new MockCalendar();
-    	assertEquals("should be equal to 0", 0, c.getActualMinimum(0));
-    }
-
+	private static final Locale[] locales = new Locale[] { Locale.getDefault(),
+			Locale.US, Locale.UK, Locale.TAIWAN, Locale.PRC, Locale.KOREA,
+			Locale.JAPAN, Locale.ITALIAN, Locale.GERMAN, Locale.ENGLISH,
+			Locale.CHINA, Locale.CANADA, Locale.FRANCE };
 
     private class MockCalendar extends Calendar {
 
@@ -521,6 +514,306 @@
 		}
     }
 
+	/**
+	 * @tests {@link java.util.Calendar#getDisplayName(int, int, Locale)}
+	 * @since 1.6
+	 */
+	public void test_getDisplayNameIILjava_util_Locale() {
+		Calendar cal = Calendar.getInstance();
+		for (int field = 0; field < Calendar.FIELD_COUNT; field++) {
+			for (Locale locale : locales) {
+				DateFormatSymbols symbols = new DateFormatSymbols(locale);
+				String value = null;
+				switch (field) {
+				case Calendar.AM_PM:
+					cal.set(Calendar.AM_PM, Calendar.AM);
+					value = symbols.getAmPmStrings()[0];
+					assertEquals(cal.getDisplayName(field, Calendar.SHORT,
+							locale), value);
+					assertEquals(cal.getDisplayName(field, Calendar.LONG,
+							locale), value);
+					cal.set(Calendar.AM_PM, Calendar.PM);
+					value = symbols.getAmPmStrings()[1];
+					assertEquals(cal.getDisplayName(field, Calendar.SHORT,
+							locale), value);
+					assertEquals(cal.getDisplayName(field, Calendar.LONG,
+							locale), value);
+					break;
+				case Calendar.ERA:
+					cal.set(Calendar.ERA, GregorianCalendar.BC);
+					value = symbols.getEras()[0];
+					assertEquals(cal.getDisplayName(field, Calendar.SHORT,
+							locale), value);
+					assertEquals(cal.getDisplayName(field, Calendar.LONG,
+							locale), value);
+					cal.set(Calendar.ERA, GregorianCalendar.AD);
+					value = symbols.getEras()[1];
+					assertEquals(cal.getDisplayName(field, Calendar.SHORT,
+							locale), value);
+					assertEquals(cal.getDisplayName(field, Calendar.LONG,
+							locale), value);
+					break;
+				case Calendar.MONTH:
+					cal.set(Calendar.DAY_OF_MONTH, 1);
+					for (int month = 0; month <= 11; month++) {
+						cal.set(Calendar.MONTH, month);
+						value = symbols.getShortMonths()[month];
+						assertEquals(cal.getDisplayName(field, Calendar.SHORT,
+								locale), value);
+						value = symbols.getMonths()[month];
+						assertEquals(cal.getDisplayName(field, Calendar.LONG,
+								locale), value);
+					}
+					break;
+				case Calendar.DAY_OF_WEEK:
+					for (int day = 1; day <= 7; day++) {
+						cal.set(Calendar.DAY_OF_WEEK, day);
+						value = symbols.getShortWeekdays()[day];
+						assertEquals(cal.getDisplayName(field, Calendar.SHORT,
+								locale), value);
+						value = symbols.getWeekdays()[day];
+						assertEquals(cal.getDisplayName(field, Calendar.LONG,
+								locale), value);
+					}
+					break;
+				default:
+					assertNull(cal
+							.getDisplayName(field, Calendar.SHORT, locale));
+					assertNull(cal.getDisplayName(field, Calendar.LONG, locale));
+				}
+			}
+		}
+
+		cal.setLenient(true);
+
+		try {
+			cal.getDisplayName(-1, Calendar.SHORT, Locale.US);
+			fail("Should throw IllegalArgumentException");
+		} catch (IllegalArgumentException e) {
+			// expected
+		}
+		try {
+			cal.getDisplayName(Calendar.FIELD_COUNT, Calendar.LONG, Locale.US);
+			fail("Should throw IllegalArgumentException");
+		} catch (IllegalArgumentException e) {
+			// expected
+		}
+		try {
+			cal.getDisplayName(Calendar.MONTH, -1, Locale.US);
+			fail("Should throw IllegalArgumentException");
+		} catch (IllegalArgumentException e) {
+			// expected
+		}
+		try {
+			cal.getDisplayName(Calendar.MONTH, 3, Locale.US);
+			fail("Should throw IllegalArgumentException");
+		} catch (IllegalArgumentException e) {
+			// expected
+		}
+		try {
+			cal.getDisplayName(Calendar.MONTH, Calendar.SHORT, null);
+			fail("Should throw NullPointerException");
+		} catch (NullPointerException e) {
+			// expected
+		}
+		try {
+			cal.getDisplayName(-1, Calendar.SHORT, null);
+			fail("Should throw IllegalArgumentException");
+		} catch (IllegalArgumentException e) {
+			// expected
+		}
+		try {
+			cal.getDisplayName(Calendar.MONTH, -1, null);
+			fail("Should throw IllegalArgumentException");
+		} catch (IllegalArgumentException e) {
+			// expected
+		}
+		// in lenient mode, following cases pass
+		cal.set(Calendar.SECOND, 999);
+		cal.getDisplayName(Calendar.MONTH, Calendar.SHORT, Locale.US);
+		// test for ALL_STYLES, it is equal to use SHORT
+		for (int field = 0; field < Calendar.FIELD_COUNT; field++) {
+			for (Locale locale : locales) {
+				String result = cal.getDisplayName(field, Calendar.ALL_STYLES,
+						locale);
+				if (field == Calendar.AM_PM || field == Calendar.ERA
+						|| field == Calendar.MONTH
+						|| field == Calendar.DAY_OF_WEEK) {
+					assertEquals(result, cal.getDisplayName(field,
+							Calendar.SHORT, locale));
+				} else {
+					assertNull(result);
+				}
+			}
+		}
+
+		// invalid value for an un-related field when the calendar is not
+		// lenient
+		cal.setLenient(false);
+		assertNotNull(cal.getDisplayName(Calendar.MONTH, Calendar.SHORT,
+				Locale.US));
+		cal.set(Calendar.SECOND, 999);
+		try {
+			cal.getDisplayName(Calendar.MONTH, Calendar.SHORT, Locale.US);
+			fail("Should throw IllegalArgumentException");
+		} catch (IllegalArgumentException e) {
+			// expected
+		}
+		try {
+			cal.getDisplayName(Calendar.MONTH, Calendar.ALL_STYLES, Locale.US);
+			fail("Should throw IllegalArgumentException");
+		} catch (IllegalArgumentException e) {
+			// expected
+		}
+	}
+
+	/**
+	 * @tests {@link java.util.Calendar#getDisplayNames(int, int, Locale)}
+	 * @since 1.6
+	 */
+	public void test_getDisplayNamesIILjava_util_Locale() {
+		assertEquals(0, Calendar.ALL_STYLES);
+		assertEquals(1, Calendar.SHORT);
+		assertEquals(2, Calendar.LONG);
+
+		Calendar cal = Calendar.getInstance(Locale.US);
+
+		for (int field = 0; field < Calendar.FIELD_COUNT; field++) {
+			for (Locale locale : locales) {
+				Map<String, Integer> shortResult = cal.getDisplayNames(field,
+						Calendar.SHORT, locale);
+				Map<String, Integer> longResult = cal.getDisplayNames(field,
+						Calendar.LONG, locale);
+				Map<String, Integer> allResult = cal.getDisplayNames(field,
+						Calendar.ALL_STYLES, locale);
+				DateFormatSymbols symbols = new DateFormatSymbols(locale);
+				String[] values = null;
+				switch (field) {
+				case Calendar.AM_PM:
+				case Calendar.ERA:
+					values = (field == Calendar.AM_PM) ? symbols
+							.getAmPmStrings() : symbols.getEras();
+					assertDisplayNameMap(values, shortResult, 0);
+					assertDisplayNameMap(values, longResult, 0);
+					assertDisplayNameMap(values, allResult, 0);
+					break;
+				case Calendar.MONTH:
+					values = symbols.getShortMonths();
+					assertDisplayNameMap(values, shortResult, 0);
+					values = symbols.getMonths();
+					assertDisplayNameMap(values, longResult, 0);
+					assertTrue(allResult.size() >= shortResult.size());
+					assertTrue(allResult.size() >= longResult.size());
+					assertTrue(allResult.size() <= shortResult.size()
+							+ longResult.size());
+					break;
+				case Calendar.DAY_OF_WEEK:
+					values = symbols.getShortWeekdays();
+					assertDisplayNameMap(values, shortResult, 1);
+					values = symbols.getWeekdays();
+					assertDisplayNameMap(values, longResult, 1);
+					assertTrue(allResult.size() >= shortResult.size());
+					assertTrue(allResult.size() >= longResult.size());
+					assertTrue(allResult.size() <= shortResult.size()
+							+ longResult.size());
+					break;
+				default:
+					assertNull(shortResult);
+					assertNull(longResult);
+					assertNull(allResult);
+				}
+			}
+		}
+
+		cal.setLenient(true);
+
+		try {
+			cal.getDisplayNames(-1, Calendar.SHORT, Locale.US);
+			fail("Should throw IllegalArgumentException");
+		} catch (IllegalArgumentException e) {
+			// expected
+		}
+		try {
+			cal.getDisplayNames(Calendar.FIELD_COUNT, Calendar.LONG, Locale.US);
+			fail("Should throw IllegalArgumentException");
+		} catch (IllegalArgumentException e) {
+			// expected
+		}
+		try {
+			cal.getDisplayNames(Calendar.MONTH, -1, Locale.US);
+			fail("Should throw IllegalArgumentException");
+		} catch (IllegalArgumentException e) {
+			// expected
+		}
+		try {
+			cal.getDisplayNames(Calendar.MONTH, 3, Locale.US);
+			fail("Should throw IllegalArgumentException");
+		} catch (IllegalArgumentException e) {
+			// expected
+		}
+		try {
+			cal.getDisplayNames(Calendar.MONTH, Calendar.SHORT, null);
+			fail("Should throw NullPointerException");
+		} catch (NullPointerException e) {
+			// expected
+		}
+		try {
+			cal.getDisplayNames(-1, Calendar.SHORT, null);
+			fail("Should throw IllegalArgumentException");
+		} catch (IllegalArgumentException e) {
+			// expected
+		}
+		try {
+			cal.getDisplayNames(Calendar.MONTH, -1, null);
+			fail("Should throw IllegalArgumentException");
+		} catch (IllegalArgumentException e) {
+			// expected
+		}
+		cal.set(Calendar.SECOND, 999);
+		cal.getDisplayNames(Calendar.MONTH, Calendar.SHORT, Locale.US);
+
+		// RI fails here
+		// invalid value for an un-related field when the calendar is not
+		// lenient
+		cal.setLenient(false);
+		cal.set(Calendar.SECOND, 999);
+		try {
+			cal.getDisplayNames(Calendar.MONTH, Calendar.SHORT, Locale.US);
+			fail("Should throw IllegalArgumentException");
+		} catch (IllegalArgumentException e) {
+			// expected
+		}
+	}
+
+	private void assertDisplayNameMap(String[] values,
+			Map<String, Integer> result, int shift) {
+		List<String> trimValue = new ArrayList<String>();
+		for (String value : values) {
+			if (value.trim().length() > 0) {
+				trimValue.add(value);
+			}
+		}
+		assertEquals(trimValue.size(), result.size());
+		for (int i = 0; i < trimValue.size(); i++) {
+			assertEquals(i + shift, result.get(trimValue.get(i)).intValue());
+		}
+	}
+
+	/**
+	 * @tests {@link java.util.Calendar#getActualMaximum(int)}
+	 */
+	public void test_getActualMaximum_I() {
+		Calendar c = new MockCalendar();
+		assertEquals("should be equal to 0", 0, c.getActualMaximum(0));
+	}
+
+	/**
+	 * @tests {@link java.util.Calendar#getActualMinimum(int)}
+	 */
+	public void test_getActualMinimum_I() {
+		Calendar c = new MockCalendar();
+		assertEquals("should be equal to 0", 0, c.getActualMinimum(0));
+	}
 
 	protected void setUp() {
 		defaultLocale = Locale.getDefault();