ICU-12585 Merging Stuart's work branch changes for re-enabling serialization tests. The change set also contains ICU 58 serialization test data for future releases (BRS).

X-SVN-Rev: 39377
This commit is contained in:
Yoshito Umaoka 2016-09-28 04:56:57 +00:00
parent 8f46bb90a3
commit 6ef22595ed
81 changed files with 1253 additions and 729 deletions

72
.gitattributes vendored
View File

@ -463,6 +463,78 @@ icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_57.1/com.ib
icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_57.1/com.ibm.icu.util.ULocale.dat -text
icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_57.1/com.ibm.icu.util.UResourceTypeMismatchException.dat -text
icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_57.1/com.ibm.icu.util.VTimeZone.dat -text
icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_58.1/com.ibm.icu.impl.DateNumberFormat.dat -text
icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_58.1/com.ibm.icu.impl.IllegalIcuArgumentException.dat -text
icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_58.1/com.ibm.icu.impl.InvalidFormatException.dat -text
icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_58.1/com.ibm.icu.impl.JavaTimeZone.dat -text
icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_58.1/com.ibm.icu.impl.OlsonTimeZone.dat -text
icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_58.1/com.ibm.icu.impl.RelativeDateFormat.dat -text
icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_58.1/com.ibm.icu.impl.TZDBTimeZoneNames.dat -text
icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_58.1/com.ibm.icu.impl.TimeZoneAdapter.dat -text
icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_58.1/com.ibm.icu.impl.TimeZoneGenericNames.dat -text
icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_58.1/com.ibm.icu.impl.TimeZoneNamesImpl.dat -text
icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_58.1/com.ibm.icu.impl.duration.BasicDurationFormat.dat -text
icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_58.1/com.ibm.icu.impl.locale.LocaleSyntaxException.dat -text
icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_58.1/com.ibm.icu.math.BigDecimal.dat -text
icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_58.1/com.ibm.icu.math.MathContext.dat -text
icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_58.1/com.ibm.icu.text.ArabicShapingException.dat -text
icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_58.1/com.ibm.icu.text.ChineseDateFormat$Field.dat -text
icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_58.1/com.ibm.icu.text.ChineseDateFormat.dat -text
icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_58.1/com.ibm.icu.text.ChineseDateFormatSymbols.dat -text
icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_58.1/com.ibm.icu.text.CompactDecimalFormat.dat -text
icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_58.1/com.ibm.icu.text.CurrencyPluralInfo.dat -text
icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_58.1/com.ibm.icu.text.DateFormat$Field.dat -text
icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_58.1/com.ibm.icu.text.DateFormat.dat -text
icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_58.1/com.ibm.icu.text.DateFormatSymbols.dat -text
icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_58.1/com.ibm.icu.text.DateIntervalFormat.dat -text
icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_58.1/com.ibm.icu.text.DateIntervalInfo$PatternInfo.dat -text
icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_58.1/com.ibm.icu.text.DateIntervalInfo.dat -text
icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_58.1/com.ibm.icu.text.DecimalFormat.dat -text
icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_58.1/com.ibm.icu.text.DecimalFormatSymbols.dat -text
icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_58.1/com.ibm.icu.text.MeasureFormat.dat -text
icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_58.1/com.ibm.icu.text.MessageFormat$Field.dat -text
icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_58.1/com.ibm.icu.text.MessageFormat.dat -text
icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_58.1/com.ibm.icu.text.NumberFormat$Field.dat -text
icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_58.1/com.ibm.icu.text.NumberFormat.dat -text
icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_58.1/com.ibm.icu.text.PluralFormat.dat -text
icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_58.1/com.ibm.icu.text.PluralRules.dat -text
icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_58.1/com.ibm.icu.text.RuleBasedNumberFormat.dat -text
icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_58.1/com.ibm.icu.text.SelectFormat.dat -text
icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_58.1/com.ibm.icu.text.SimpleDateFormat.dat -text
icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_58.1/com.ibm.icu.text.StringPrepParseException.dat -text
icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_58.1/com.ibm.icu.text.TimeUnitFormat.dat -text
icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_58.1/com.ibm.icu.text.TimeZoneFormat.dat -text
icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_58.1/com.ibm.icu.util.AnnualTimeZoneRule.dat -text
icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_58.1/com.ibm.icu.util.BuddhistCalendar.dat -text
icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_58.1/com.ibm.icu.util.Calendar.dat -text
icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_58.1/com.ibm.icu.util.ChineseCalendar.dat -text
icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_58.1/com.ibm.icu.util.CopticCalendar.dat -text
icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_58.1/com.ibm.icu.util.Currency.dat -text
icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_58.1/com.ibm.icu.util.DangiCalendar.dat -text
icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_58.1/com.ibm.icu.util.DateInterval.dat -text
icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_58.1/com.ibm.icu.util.DateTimeRule.dat -text
icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_58.1/com.ibm.icu.util.EthiopicCalendar.dat -text
icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_58.1/com.ibm.icu.util.GregorianCalendar.dat -text
icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_58.1/com.ibm.icu.util.HebrewCalendar.dat -text
icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_58.1/com.ibm.icu.util.ICUCloneNotSupportedException.dat -text
icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_58.1/com.ibm.icu.util.ICUException.dat -text
icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_58.1/com.ibm.icu.util.ICUUncheckedIOException.dat -text
icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_58.1/com.ibm.icu.util.IllformedLocaleException.dat -text
icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_58.1/com.ibm.icu.util.IndianCalendar.dat -text
icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_58.1/com.ibm.icu.util.InitialTimeZoneRule.dat -text
icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_58.1/com.ibm.icu.util.IslamicCalendar.dat -text
icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_58.1/com.ibm.icu.util.JapaneseCalendar.dat -text
icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_58.1/com.ibm.icu.util.MeasureUnit.dat -text
icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_58.1/com.ibm.icu.util.PersianCalendar.dat -text
icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_58.1/com.ibm.icu.util.RuleBasedTimeZone.dat -text
icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_58.1/com.ibm.icu.util.SimpleTimeZone.dat -text
icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_58.1/com.ibm.icu.util.TaiwanCalendar.dat -text
icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_58.1/com.ibm.icu.util.TimeArrayTimeZoneRule.dat -text
icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_58.1/com.ibm.icu.util.TimeUnit.dat -text
icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_58.1/com.ibm.icu.util.TimeZone.dat -text
icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_58.1/com.ibm.icu.util.ULocale.dat -text
icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_58.1/com.ibm.icu.util.UResourceTypeMismatchException.dat -text
icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_58.1/com.ibm.icu.util.VTimeZone.dat -text
icu4j/main/tests/core/src/com/ibm/icu/dev/test/util/Trie2Test.setRanges1.16.tri2 -text
icu4j/main/tests/core/src/com/ibm/icu/dev/test/util/Trie2Test.setRanges1.32.tri2 -text
icu4j/main/tests/core/src/com/ibm/icu/dev/test/util/Trie2Test.setRanges2.16.tri2 -text

View File

@ -1505,6 +1505,7 @@ public class DecimalFormatSymbols implements Cloneable, Serializable {
if (digitStrings == null) {
digitStrings = new String[10];
if (digits != null && digits.length == 10) {
zeroDigit = digits[0];
for (int i = 0; i < 10; i++) {
digitStrings[i] = String.valueOf(digits[i]);
}
@ -1538,7 +1539,7 @@ public class DecimalFormatSymbols implements Cloneable, Serializable {
monetarySeparatorString = String.valueOf(monetarySeparator);
}
if (monetaryGroupingSeparatorString == null) {
monetaryGroupingSeparatorString = String.valueOf(monetaryGroupingSeparatorString);
monetaryGroupingSeparatorString = String.valueOf(monetaryGroupingSeparator);
}
}

View File

@ -23,7 +23,7 @@ import com.ibm.icu.util.ULocale.Category;
* is used as the civil calendar in most of the Arab world and the
* liturgical calendar of the Islamic faith worldwide. This calendar
* is also known as the "Hijri" calendar, since it starts at the time
* of Mohammed's emigration (or "hijra") to Medinah on Thursday,
* of Mohammed's emigration (or "hijra") to Medinah on Thursday,
* July 15, 622 AD (Julian).
* <p>
* The Islamic calendar is strictly lunar, and thus an Islamic year of twelve
@ -46,8 +46,8 @@ import com.ibm.icu.util.ULocale.Category;
* This is the default behavior of a newly-created <code>IslamicCalendar</code>
* object.
* <p>
* The Islamic <em>religious</em> calendar and Saudi Arabia's <em>Umm al-Qura</em>
* calendar, however, are based on the <em>observation</em> of the crescent moon.
* The Islamic <em>religious</em> calendar and Saudi Arabia's <em>Umm al-Qura</em>
* calendar, however, are based on the <em>observation</em> of the crescent moon.
* It is thus affected by the position at which the
* observations are made, seasonal variations in the time of sunset, the
* eccentricities of the moon's orbit, and even the weather at the observation
@ -63,21 +63,21 @@ import com.ibm.icu.util.ULocale.Category;
* calculations. At present, the approximations used in this class are fairly
* simplistic; they will be improved in later versions of the code.
* <p>
* Like the Islamic religious calendar, <em>Umm al-Qura</em> is also based
* Like the Islamic religious calendar, <em>Umm al-Qura</em> is also based
* on the sighting method of the crescent moon but is standardized by Saudi Arabia.
* <p>
* <p>
* The {@link #setCalculationType(CalculationType) setCalculationType} method determines
* which approach is used to determine the start of a month. By default, the
* fixed-cycle <em>civil</em> calendar is used. However, if <code>setCalculationType(ISLAMIC)</code>
* is called, an approximation of the true lunar calendar will be used.
* Similarly, if <code>setCalculationType(ISLAMIC_UMALQURA)</code> is called, an approximation
* Similarly, if <code>setCalculationType(ISLAMIC_UMALQURA)</code> is called, an approximation
* of the Umm al-Qura lunar calendar will be used.
* <p>
* This class should not be subclassed.</p>
* <p>
* IslamicCalendar usually should be instantiated using
* IslamicCalendar usually should be instantiated using
* {@link com.ibm.icu.util.Calendar#getInstance(ULocale)} passing in a <code>ULocale</code>
* with the tag <code>"@calendar=islamic"</code> or <code>"@calendar=islamic-civil"</code>
* with the tag <code>"@calendar=islamic"</code> or <code>"@calendar=islamic-civil"</code>
* or <code>"@calendar=islamic-umalqura"</code>.</p>
*
* @see com.ibm.icu.util.GregorianCalendar
@ -94,76 +94,76 @@ public class IslamicCalendar extends Calendar {
//-------------------------------------------------------------------------
// Constants...
//-------------------------------------------------------------------------
/**
* Constant for Muharram, the 1st month of the Islamic year.
* @stable ICU 2.8
* Constant for Muharram, the 1st month of the Islamic year.
* @stable ICU 2.8
*/
public static final int MUHARRAM = 0;
/**
* Constant for Safar, the 2nd month of the Islamic year.
* @stable ICU 2.8
* Constant for Safar, the 2nd month of the Islamic year.
* @stable ICU 2.8
*/
public static final int SAFAR = 1;
/**
* Constant for Rabi' al-awwal (or Rabi' I), the 3rd month of the Islamic year.
* @stable ICU 2.8
* Constant for Rabi' al-awwal (or Rabi' I), the 3rd month of the Islamic year.
* @stable ICU 2.8
*/
public static final int RABI_1 = 2;
/**
* Constant for Rabi' al-thani or (Rabi' II), the 4th month of the Islamic year.
* @stable ICU 2.8
* Constant for Rabi' al-thani or (Rabi' II), the 4th month of the Islamic year.
* @stable ICU 2.8
*/
public static final int RABI_2 = 3;
/**
* Constant for Jumada al-awwal or (Jumada I), the 5th month of the Islamic year.
* @stable ICU 2.8
* Constant for Jumada al-awwal or (Jumada I), the 5th month of the Islamic year.
* @stable ICU 2.8
*/
public static final int JUMADA_1 = 4;
/**
* Constant for Jumada al-thani or (Jumada II), the 6th month of the Islamic year.
* @stable ICU 2.8
* Constant for Jumada al-thani or (Jumada II), the 6th month of the Islamic year.
* @stable ICU 2.8
*/
public static final int JUMADA_2 = 5;
/**
* Constant for Rajab, the 7th month of the Islamic year.
* @stable ICU 2.8
* Constant for Rajab, the 7th month of the Islamic year.
* @stable ICU 2.8
*/
public static final int RAJAB = 6;
/**
* Constant for Sha'ban, the 8th month of the Islamic year.
* @stable ICU 2.8
* Constant for Sha'ban, the 8th month of the Islamic year.
* @stable ICU 2.8
*/
public static final int SHABAN = 7;
/**
* Constant for Ramadan, the 9th month of the Islamic year.
* @stable ICU 2.8
* Constant for Ramadan, the 9th month of the Islamic year.
* @stable ICU 2.8
*/
public static final int RAMADAN = 8;
/**
* Constant for Shawwal, the 10th month of the Islamic year.
* @stable ICU 2.8
* Constant for Shawwal, the 10th month of the Islamic year.
* @stable ICU 2.8
*/
public static final int SHAWWAL = 9;
/**
* Constant for Dhu al-Qi'dah, the 11th month of the Islamic year.
* @stable ICU 2.8
* Constant for Dhu al-Qi'dah, the 11th month of the Islamic year.
* @stable ICU 2.8
*/
public static final int DHU_AL_QIDAH = 10;
/**
* Constant for Dhu al-Hijjah, the 12th month of the Islamic year.
* @stable ICU 2.8
* Constant for Dhu al-Hijjah, the 12th month of the Islamic year.
* @stable ICU 2.8
*/
public static final int DHU_AL_HIJJAH = 11;
@ -331,7 +331,7 @@ public class IslamicCalendar extends Calendar {
public void setCivil(boolean beCivil)
{
civil = beCivil;
if (beCivil && cType != CalculationType.ISLAMIC_CIVIL) {
// The fields of the calendar will become invalid, because the calendar
// rules are different
@ -348,7 +348,7 @@ public class IslamicCalendar extends Calendar {
setTimeInMillis(m);
}
}
/**
* Returns <code>true</code> if this object is using the fixed-cycle civil
* calendar, or <code>false</code> if using the religious, astronomical
@ -362,7 +362,7 @@ public class IslamicCalendar extends Calendar {
}
return false;
}
//-------------------------------------------------------------------------
// Minimum / Maximum access functions
//-------------------------------------------------------------------------
@ -396,9 +396,9 @@ public class IslamicCalendar extends Calendar {
{/* */}, // JULIAN_DAY
{/* */}, // MILLISECONDS_IN_DAY
};
/*
* bit map array where a bit turned on represents a month with 30 days.
* bit map array where a bit turned on represents a month with 30 days.
*/
private static final int[] UMALQURA_MONTHLENGTH = {
//* 1300 -1302 */ "1010 1010 1010", "1101 0101 0100", "1110 1100 1001",
@ -510,6 +510,7 @@ public class IslamicCalendar extends Calendar {
/**
* @stable ICU 2.8
*/
@Override
protected int handleGetLimit(int field, int limitType) {
return LIMITS[field][limitType];
}
@ -578,7 +579,7 @@ public class IslamicCalendar extends Calendar {
{
return (14 + 11 * year) % 30 < 11;
}
/**
* Return the day # on which the given year starts. Days are counted
* from the Hijri epoch, origin 0.
@ -594,7 +595,7 @@ public class IslamicCalendar extends Calendar {
} else if(cType == CalculationType.ISLAMIC_UMALQURA){
year -= UMALQURA_YEAR_START;
// rounded least-squares fit of the dates previously calculated from UMALQURA_MONTHLENGTH iteration
int yrStartLinearEstimate = (int)((354.36720 * (double)year) + 460322.05 + 0.5);
int yrStartLinearEstimate = (int)((354.36720 * year) + 460322.05 + 0.5);
// need a slight correction to some
ys = yrStartLinearEstimate + UMALQURA_YEAR_START_ESTIMATE_FIX[year];
}
@ -630,7 +631,7 @@ public class IslamicCalendar extends Calendar {
return ms;
}
/**
* Find the day number on which a particular month of the true/lunar
* Islamic calendar starts.
@ -646,7 +647,7 @@ public class IslamicCalendar extends Calendar {
if (start == CalendarCache.EMPTY)
{
// Make a guess at when the month started, using the average length
long origin = HIJRA_MILLIS
long origin = HIJRA_MILLIS
+ (long)Math.floor(month * CalendarAstronomer.SYNODIC_MONTH) * ONE_DAY;
double age = moonAge(origin);
@ -667,7 +668,7 @@ public class IslamicCalendar extends Calendar {
}
start = (origin - HIJRA_MILLIS) / ONE_DAY + 1;
cache.put(month, start);
}
return start;
@ -676,7 +677,7 @@ public class IslamicCalendar extends Calendar {
/**
* Return the "age" of the moon at the given time; this is the difference
* in ecliptic latitude between the moon and the sun. This method simply
* calls CalendarAstronomer.moonAge, converts to degrees,
* calls CalendarAstronomer.moonAge, converts to degrees,
* and adjusts the resultto be in the range [-180, 180].
*
* @param time The time at which the moon's age is desired,
@ -685,7 +686,7 @@ public class IslamicCalendar extends Calendar {
static final double moonAge(long time)
{
double age = 0;
synchronized(astro) {
astro.setTime(time);
age = astro.getMoonAge();
@ -702,12 +703,12 @@ public class IslamicCalendar extends Calendar {
//-------------------------------------------------------------------------
// Internal data....
//
// And an Astronomer object for the moon age calculations
private static CalendarAstronomer astro = new CalendarAstronomer();
private static CalendarCache cache = new CalendarCache();
/**
* <code>true</code> if this object uses the fixed-cycle Islamic civil calendar,
* and <code>false</code> if it approximates the true religious calendar using
@ -716,10 +717,10 @@ public class IslamicCalendar extends Calendar {
* @serial
*/
private boolean civil = true;
/**
* determines the type of calculation to use for this instance
*
*
* @serial
* @stable ICU 52
*/
@ -736,17 +737,18 @@ public class IslamicCalendar extends Calendar {
* @param month The hijri month, 0-based
* @stable ICU 2.8
*/
@Override
protected int handleGetMonthLength(int extendedYear, int month) {
int length;
if (cType == CalculationType.ISLAMIC_CIVIL
|| cType == CalculationType.ISLAMIC_TBLA
|| (cType == CalculationType.ISLAMIC_UMALQURA && (extendedYear < UMALQURA_YEAR_START || extendedYear > UMALQURA_YEAR_END) )) {
length = 29 + (month+1) % 2;
if (month == DHU_AL_HIJJAH && civilLeapYear(extendedYear)) {
length++;
}
}
}
else if (cType == CalculationType.ISLAMIC) {
month = 12*(extendedYear-1) + month;
@ -754,7 +756,7 @@ public class IslamicCalendar extends Calendar {
}
else { // cType == CalculationType.ISLAMIC_UMALQURA should be true at this point and not null.
int idx = (extendedYear - UMALQURA_YEAR_START); // calculate year offset into bit map array
int mask = (0x01 << (11 - month)); // set mask for bit corresponding to month
int mask = (0x01 << (11 - month)); // set mask for bit corresponding to month
if((UMALQURA_MONTHLENGTH[idx] & mask) == 0 ) {
length = 29;
}
@ -769,8 +771,9 @@ public class IslamicCalendar extends Calendar {
* Return the number of days in the given Islamic year
* @stable ICU 2.8
*/
@Override
protected int handleGetYearLength(int extendedYear) {
int length =0;
int length =0;
if (cType == CalculationType.ISLAMIC_CIVIL
|| cType == CalculationType.ISLAMIC_TBLA
|| (cType == CalculationType.ISLAMIC_UMALQURA && (extendedYear < UMALQURA_YEAR_START || extendedYear > UMALQURA_YEAR_END) )) {
@ -785,7 +788,7 @@ public class IslamicCalendar extends Calendar {
return length;
}
//-------------------------------------------------------------------------
// Functions for converting from field values to milliseconds....
//-------------------------------------------------------------------------
@ -798,9 +801,10 @@ public class IslamicCalendar extends Calendar {
/**
* @stable ICU 2.8
*/
@Override
protected int handleComputeMonthStart(int eyear, int month, boolean useMonth) {
return (int)(monthStart(eyear, month) + ((cType == CalculationType.ISLAMIC_TBLA)? ASTRONOMICAL_EPOC: CIVIL_EPOC) - 1);
}
}
//-------------------------------------------------------------------------
// Functions for converting from milliseconds to field values
@ -809,6 +813,7 @@ public class IslamicCalendar extends Calendar {
/**
* @stable ICU 2.8
*/
@Override
protected int handleGetExtendedYear() {
int year;
if (newerField(EXTENDED_YEAR, YEAR) == EXTENDED_YEAR) {
@ -829,12 +834,13 @@ public class IslamicCalendar extends Calendar {
* <li>DAY_OF_MONTH
* <li>DAY_OF_YEAR
* <li>EXTENDED_YEAR</ul>
*
*
* The DAY_OF_WEEK and DOW_LOCAL fields are already set when this
* method is called. The getGregorianXxx() methods return Gregorian
* calendar equivalents for the given Julian day.
* @stable ICU 2.8
*/
@Override
protected void handleComputeFields(int julianDay) {
int year =0, month=0, dayOfMonth=0, dayOfYear=0;
long monthStart;
@ -878,14 +884,14 @@ public class IslamicCalendar extends Calendar {
} else {
int y =UMALQURA_YEAR_START-1, m =0;
long d = 1;
while(d > 0) {
y++;
while(d > 0) {
y++;
d = days - yearStart(y) +1;
if(d == handleGetYearLength(y)) {
m=11;
break;
} else if(d < handleGetYearLength(y) ) {
int monthLen = handleGetMonthLength(y, m);
int monthLen = handleGetMonthLength(y, m);
m=0;
while(d > monthLen) {
d -= monthLen;
@ -900,24 +906,24 @@ public class IslamicCalendar extends Calendar {
}
}
dayOfMonth = (int)(days - monthStart(year, month)) + 1;
// Now figure out the day of the year.
dayOfYear = (int)(days - monthStart(year, 0) + 1);
internalSet(ERA, 0);
internalSet(YEAR, year);
internalSet(EXTENDED_YEAR, year);
internalSet(MONTH, month);
internalSet(DAY_OF_MONTH, dayOfMonth);
internalSet(DAY_OF_YEAR, dayOfYear);
}
internalSet(DAY_OF_YEAR, dayOfYear);
}
/**
* enumeration of available calendar calculation types
*
*
* @stable ICU 52
*/
public enum CalculationType {
@ -954,17 +960,17 @@ public class IslamicCalendar extends Calendar {
return bcpType;
}
};
/**
* sets the calculation type for this calendar.
*
*
* @stable ICU 55
*/
public void setCalculationType(CalculationType type) {
cType = type;
// ensure civil property is up-to-date
if(cType == CalculationType.ISLAMIC_CIVIL)
if(cType == CalculationType.ISLAMIC_CIVIL)
civil = true;
else
civil = false;
@ -972,7 +978,7 @@ public class IslamicCalendar extends Calendar {
/**
* gets the calculation type for this calendar.
*
*
* @stable ICU 55
*/
public CalculationType getCalculationType() {
@ -984,23 +990,24 @@ public class IslamicCalendar extends Calendar {
*/
private void setCalcTypeForLocale(ULocale locale) {
String localeCalType = CalendarUtil.getCalendarType(locale);
if("islamic-civil".equals(localeCalType))
if("islamic-civil".equals(localeCalType))
setCalculationType(CalculationType.ISLAMIC_CIVIL);
else if("islamic-umalqura".equals(localeCalType))
else if("islamic-umalqura".equals(localeCalType))
setCalculationType(CalculationType.ISLAMIC_UMALQURA);
else if("islamic-tbla".equals(localeCalType))
else if("islamic-tbla".equals(localeCalType))
setCalculationType(CalculationType.ISLAMIC_TBLA);
else if(localeCalType.startsWith("islamic"))
setCalculationType(CalculationType.ISLAMIC); // needs to be last so it's always the default if it's islamic-something-unhandled
else
setCalculationType(CalculationType.ISLAMIC); // needs to be last so it's always the default if it's islamic-something-unhandled
else
setCalculationType(CalculationType.ISLAMIC_CIVIL); // default for any non-islamic calendar locale
}
/**
* {@inheritDoc}
* @stable ICU 3.8
*/
@Override
public String getType() {
if (cType == null) {
// TODO: getType() is called during Islamic calendar
@ -1011,20 +1018,19 @@ public class IslamicCalendar extends Calendar {
return cType.bcpType();
}
private void readObject(ObjectInputStream in) throws IOException,ClassNotFoundException
{
in.defaultReadObject();
if(cType != CalculationType.ISLAMIC_CIVIL)
return; // we've serialized something new, nothing else to do
// new calculation type is civil (default) but civil is false. This will only happen
// when deserializing a non-civil calender so need to adjust new CalculationType to match
// serialized form
if(!civil)
cType = CalculationType.ISLAMIC;
private void readObject(ObjectInputStream in) throws IOException,ClassNotFoundException {
in.defaultReadObject();
if (cType == null) {
// The serialized data was created by an ICU version before CalculationType
// was introduced.
cType = civil ? CalculationType.ISLAMIC_CIVIL : CalculationType.ISLAMIC;
} else {
// Make sure 'civil' is consistent with CalculationType
civil = (cType == CalculationType.ISLAMIC_CIVIL);
}
}
/*
private static CalendarFactory factory;
public static CalendarFactory factory() {

View File

@ -34,10 +34,25 @@ import com.ibm.icu.util.ULocale;
*/
public abstract class CalendarHandler implements SerializableTestUtility.Handler
{
@Override
public boolean hasSameBehavior(Object a, Object b)
{
Calendar cal_a = (Calendar) a;
Calendar cal_b = (Calendar) b;
// Make sure tzid is preserved
TimeZone tz_a = cal_a.getTimeZone();
TimeZone tz_b = cal_b.getTimeZone();
if (!tz_a.getID().equals(tz_b.getID())) {
return false;
}
// The deserialized TimeZone may have different rule.
// To compare the behavior, we need to use the same
// TimeZone.
cal_a.setTimeZone(tz_b);
long now = System.currentTimeMillis();
cal_a.setTimeInMillis(now);
@ -51,6 +66,7 @@ public abstract class CalendarHandler implements SerializableTestUtility.Handler
static class BasicCalendarHandler extends CalendarHandler
{
@Override
public Object[] getTestObjects()
{
Locale locales[] = SerializableTestUtility.getLocales();
@ -64,193 +80,205 @@ public abstract class CalendarHandler implements SerializableTestUtility.Handler
return calendars;
}
}
static class BuddhistCalendarHandler extends CalendarHandler
{
@Override
public Object[] getTestObjects()
{
Locale locales[] = SerializableTestUtility.getLocales();
TimeZone tst = TimeZone.getTimeZone("Asia/Bangkok");
BuddhistCalendar calendars[] = new BuddhistCalendar[locales.length];
for (int i = 0; i < locales.length; i += 1) {
calendars[i] = new BuddhistCalendar(tst, locales[i]);
}
return calendars;
}
}
static class ChineseCalendarHandler extends CalendarHandler
{
@Override
public Object[] getTestObjects()
{
Locale locales[] = SerializableTestUtility.getLocales();
TimeZone cst = TimeZone.getTimeZone("Asia/Shanghai");
ChineseCalendar calendars[] = new ChineseCalendar[locales.length];
for (int i = 0; i < locales.length; i += 1) {
calendars[i] = new ChineseCalendar(cst, locales[i]);
}
return calendars;
return calendars;
}
}
static class CopticCalendarHandler extends CalendarHandler
{
@Override
public Object[] getTestObjects()
{
Locale locales[] = SerializableTestUtility.getLocales();
TimeZone ast = TimeZone.getTimeZone("Europe/Athens");
CopticCalendar calendars[] = new CopticCalendar[locales.length];
for (int i = 0; i < locales.length; i += 1) {
calendars[i] = new CopticCalendar(ast, locales[i]);
}
return calendars;
return calendars;
}
}
static class DangiCalendarHandler extends CalendarHandler
{
@Override
public Object[] getTestObjects()
{
Locale locales[] = SerializableTestUtility.getLocales();
TimeZone kst = TimeZone.getTimeZone("Asia/Seoul");
DangiCalendar calendars[] = new DangiCalendar[locales.length];
for (int i = 0; i < locales.length; i += 1) {
calendars[i] = new DangiCalendar(kst, ULocale.forLocale(locales[i]));
}
return calendars;
return calendars;
}
}
static class EthiopicCalendarHandler extends CalendarHandler
{
@Override
public Object[] getTestObjects()
{
Locale locales[] = SerializableTestUtility.getLocales();
TimeZone ast = TimeZone.getTimeZone("Africa/Addis_Ababa");
EthiopicCalendar calendars[] = new EthiopicCalendar[locales.length];
for (int i = 0; i < locales.length; i += 1) {
calendars[i] = new EthiopicCalendar(ast, locales[i]);
}
return calendars;
return calendars;
}
}
static class GregorianCalendarHandler extends CalendarHandler
{
@Override
public Object[] getTestObjects()
{
Locale locales[] = SerializableTestUtility.getLocales();
TimeZone pst = TimeZone.getTimeZone("America/Los_Angeles");
GregorianCalendar calendars[] = new GregorianCalendar[locales.length];
for (int i = 0; i < locales.length; i += 1) {
calendars[i] = new GregorianCalendar(pst, locales[i]);
}
return calendars;
return calendars;
}
}
static class HebrewCalendarHandler extends CalendarHandler
{
@Override
public Object[] getTestObjects()
{
Locale locales[] = SerializableTestUtility.getLocales();
TimeZone jst = TimeZone.getTimeZone("Asia/Jerusalem");
HebrewCalendar calendars[] = new HebrewCalendar[locales.length];
for (int i = 0; i < locales.length; i += 1) {
calendars[i] = new HebrewCalendar(jst, locales[i]);
}
return calendars;
return calendars;
}
}
static class IndianCalendarHandler extends CalendarHandler
{
@Override
public Object[] getTestObjects()
{
Locale locales[] = SerializableTestUtility.getLocales();
TimeZone jst = TimeZone.getTimeZone("Asia/Calcutta");
IndianCalendar calendars[] = new IndianCalendar[locales.length];
for (int i = 0; i < locales.length; i += 1) {
calendars[i] = new IndianCalendar(jst, locales[i]);
}
return calendars;
return calendars;
}
}
static class IslamicCalendarHandler extends CalendarHandler
{
@Override
public Object[] getTestObjects() {
Locale locales[] = SerializableTestUtility.getLocales();
TimeZone cst = TimeZone.getTimeZone("Africa/Cairo");
IslamicCalendar calendars[] = new IslamicCalendar[locales.length];
for (int i = 0; i < locales.length; i += 1) {
calendars[i] = new IslamicCalendar(cst, locales[i]);
}
return calendars;
return calendars;
}
}
static class JapaneseCalendarHandler extends CalendarHandler
{
@Override
public Object[] getTestObjects()
{
Locale locales[] = SerializableTestUtility.getLocales();
TimeZone jst = TimeZone.getTimeZone("Asia/Tokyo");
JapaneseCalendar calendars[] = new JapaneseCalendar[locales.length];
for (int i = 0; i < locales.length; i += 1) {
calendars[i] = new JapaneseCalendar(jst, locales[i]);
}
return calendars;
return calendars;
}
}
static class PersianCalendarHandler extends CalendarHandler
{
@Override
public Object[] getTestObjects()
{
Locale locales[] = SerializableTestUtility.getLocales();
TimeZone kst = TimeZone.getTimeZone("Asia/Tehran");
PersianCalendar calendars[] = new PersianCalendar[locales.length];
for (int i = 0; i < locales.length; i += 1) {
calendars[i] = new PersianCalendar(kst, ULocale.forLocale(locales[i]));
}
return calendars;
return calendars;
}
}
static class TaiwanCalendarHandler extends CalendarHandler {
@Override
public Object[] getTestObjects() {
Locale locales[] = SerializableTestUtility.getLocales();
TimeZone cst = TimeZone.getTimeZone("Asia/Shanghai");
TaiwanCalendar calendars[] = new TaiwanCalendar[locales.length];
for (int i = 0; i < locales.length; i += 1) {
calendars[i] = new TaiwanCalendar(cst, locales[i]);
}
return calendars;
return calendars;
}
}
}

View File

@ -12,12 +12,16 @@ package com.ibm.icu.dev.test.serializable;
import java.io.File;
import java.io.FileFilter;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.JarURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
@ -34,92 +38,167 @@ import junitparams.Parameters;
@RunWith(JUnitParamsRunner.class)
public class CompatibilityTest extends TestFmwk
{
//TODO(junit) - requires code to read the serialized classes from a jar
@Ignore
private static final class FileHolder {
String className;
String icuVersion;
byte[] b;
boolean skip;
FileHolder(String fileName, byte[] b) {
this.b = b;
// Replace '\' with '/' to normalize fileName before extracting
// substrings. This is required if serialization test data is
// loaded from Windows file system.
String tmpPath = fileName.replaceAll("\\\\", "/");
int fileBreak = tmpPath.lastIndexOf('/');
this.className = fileName.substring(fileBreak + 1, tmpPath.lastIndexOf('.'));
int finalDirBreak = tmpPath.lastIndexOf("/ICU");
this.icuVersion = tmpPath.substring(finalDirBreak + 1, fileBreak);
className = className.substring(className.lastIndexOf('/') + 1);
this.skip = skipFile(this.icuVersion, this.className);
}
private static boolean skipFile(String icuVersion, String className) {
for (int skip = 0; skip < SKIP_CASES.length; skip++) {
if (icuVersion.equals(SKIP_CASES[skip][0]) && className.equals(SKIP_CASES[skip][1])) {
return true;
}
}
return false;
}
@Override
public String toString() {
return icuVersion + "[" + className + "]";
}
}
@Test
@Parameters(method="generateClassList")
public void testCompatibility(String testFileName) throws ClassNotFoundException, IOException {
File testFile = new File(testFileName);
Object[] oldObjects = SerializableTestUtility.getSerializedObjects(testFile);
int start = testFileName.lastIndexOf('/') + 1;
int end = testFileName.lastIndexOf('.');
String className = testFileName.substring(start, end);
Handler classHandler = SerializableTestUtility.getHandler(className);
public void testCompatibility(FileHolder holder) throws ClassNotFoundException, IOException {
if (holder.skip) {
logln("Skipping File = " + holder);
return;
}
Object[] oldObjects = SerializableTestUtility.getSerializedObjects(holder.b);
Handler classHandler = SerializableTestUtility.getHandler(holder.className);
Object[] testObjects = classHandler.getTestObjects();
for (int i = 0; i < testObjects.length; i++) {
if (!classHandler.hasSameBehavior(oldObjects[i], testObjects[i])) {
errln("Input object " + i + " failed behavior test.");
}
}
}
}
@SuppressWarnings("unused")
private List<String> generateClassList() {
List<String> classList = new ArrayList();
@SuppressWarnings("unused")
private List<FileHolder> generateClassList() throws IOException {
URL dataURL = getClass().getResource("data");
String protocol = dataURL.getProtocol();
if (protocol.equals("jar")) {
return getJarList(dataURL);
} else if (protocol.equals("file")) {
return getFileList(dataURL);
} else {
errln("Don't know how to test " + dataURL);
return null;
}
}
private List<FileHolder> getFileList(URL dataURL) throws IOException {
List<FileHolder> classList = new ArrayList();
File topDir = new File(dataURL.getPath());
File dataDirs[] = topDir.listFiles(new FileFilter() {
File dataDirs[] = topDir.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
return pathname.isDirectory();
}});
File dataDirs2[] = topDir.listFiles();
System.out.println("topDir = " + topDir);
//System.out.println("dataDirs = " + dataDirs);
System.out.println("dataDirs2 = " + dataDirs2);
for (File dataDir : dataDirs2) {
System.out.println("\t" + dataDir);
}
for (File dataDir : dataDirs) {
File files[] = dataDir.listFiles(new FileFilter() {
File files[] = dataDir.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
return pathname.isFile() && pathname.getName().endsWith(".dat");
}});
String dataDirName = dataDir.getName();
for (File file : files) {
FileInputStream fis = new FileInputStream(file);
byte[] fileBytes;
try {
fileBytes = SerializableTestUtility.copyStreamBytes(fis);
} finally {
fis.close();
}
classList.add(new FileHolder(file.getAbsolutePath(), fileBytes));
}
}
return classList;
}
element_loop:
for (File file : files) {
String filename = file.getName();
String className = filename.substring(0, filename.lastIndexOf("."));
private List<FileHolder> getJarList(URL jarURL) throws IOException {
List<FileHolder> classList = new ArrayList();
String prefix = jarURL.getPath();
int ix = prefix.indexOf("!/");
if (ix >= 0) {
prefix = prefix.substring(ix + 2);
}
JarFile jarFile = null;
try {
String urlAsString = jarURL.toExternalForm();
ix = urlAsString.indexOf("!/");
jarURL = new URL(urlAsString.substring(0, ix + 2));
JarURLConnection conn = (JarURLConnection) jarURL.openConnection();
jarFile = conn.getJarFile();
Enumeration entries = jarFile.entries();
while (entries.hasMoreElements()) {
JarEntry entry = (JarEntry) entries.nextElement();
if (!entry.isDirectory()) {
String entryName = entry.getName();
if (entryName.startsWith(prefix) && entryName.endsWith(".dat")) {
FileHolder holder = new FileHolder(entryName,
SerializableTestUtility.copyStreamBytes(jarFile.getInputStream(entry)));
classList.add(holder);
// Skip some cases which do not work well
for (int skip = 0; skip < SKIP_CASES.length; skip++) {
if (dataDirName.equals(SKIP_CASES[skip][0]) && filename.equals(SKIP_CASES[skip][1])) {
logln("Skipping test case - " + dataDirName + "/" + className);
continue element_loop;
}
}
classList.add(file.getAbsolutePath());
}
} finally {
if (jarFile != null) {
jarFile.close();
}
}
// TODO(junit): add randomization support on the list based on the params object
return classList;
}
private static final String[][] SKIP_CASES = {
// ICU 52+ PluralRules/PluralFormat/CurrencyPluralInfo are not
// serialization-compatible with previous versions.
{"ICU_50.1", "com.ibm.icu.text.CurrencyPluralInfo.dat"},
{"ICU_51.1", "com.ibm.icu.text.CurrencyPluralInfo.dat"},
// serialization-compatible with previous versions.
{"ICU_50.1", "com.ibm.icu.text.CurrencyPluralInfo"},
{"ICU_51.1", "com.ibm.icu.text.CurrencyPluralInfo"},
{"ICU_50.1", "com.ibm.icu.text.PluralFormat.dat"},
{"ICU_51.1", "com.ibm.icu.text.PluralFormat.dat"},
{"ICU_50.1", "com.ibm.icu.text.PluralFormat"},
{"ICU_51.1", "com.ibm.icu.text.PluralFormat"},
{"ICU_50.1", "com.ibm.icu.text.PluralRules.dat"},
{"ICU_51.1", "com.ibm.icu.text.PluralRules.dat"},
{"ICU_50.1", "com.ibm.icu.text.PluralRules"},
{"ICU_51.1", "com.ibm.icu.text.PluralRules"},
// GeneralMeasureFormat was in technical preview, but is going away after ICU 52.1.
{"ICU_52.1", "com.ibm.icu.text.GeneralMeasureFormat.dat"},
{"ICU_52.1", "com.ibm.icu.text.GeneralMeasureFormat"},
// RuleBasedNumberFormat
{"ICU_3.6", "com.ibm.icu.text.RuleBasedNumberFormat.dat"},
{"ICU_3.6", "com.ibm.icu.text.RuleBasedNumberFormat"},
// ICU 4.8+ MessageFormat is not serialization-compatible with previous versions.
{"ICU_3.6", "com.ibm.icu.text.MessageFormat.dat"},
{"ICU_3.6", "com.ibm.icu.text.MessageFormat"},
};
}

View File

@ -38,7 +38,7 @@ public class CoverageTest extends TestFmwk {
Handler classHandler = SerializableTestUtility.getHandler(className);
if (classHandler == null) {
if (!Modifier.isAbstract(m)) {
//errln("Missing test handler. Update the list of tests in SerializableTest.java to include a test case for " + className);
errln("Missing test handler. Update the list of tests in SerializableTest.java to include a test case for " + className);
}
return;
}
@ -48,10 +48,10 @@ public class CoverageTest extends TestFmwk {
for (int i = 0; i < testObjects.length; i++) {
if (!classHandler.hasSameBehavior(serializedObjects[i], testObjects[i])) {
errln("Input object " + className + "(" + i + ") failed behavior test.");
}
}
}
}
List<String> generateClassList() throws IOException {
return SerializableTestUtility.getSerializationClassList(this);
}

View File

@ -16,6 +16,7 @@ import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.lang.reflect.Modifier;
@ -70,34 +71,36 @@ public class SerializableTestUtility {
e.printStackTrace();
}
}
public interface Handler
{
public Object[] getTestObjects();
public boolean hasSameBehavior(Object a, Object b);
}
public static Handler getHandler(String className)
{
return (Handler) map.get(className);
}
private static class TimeZoneHandler implements Handler
{
String[] ZONES = { "GMT", "MET", "IST" };
@Override
public Object[] getTestObjects()
{
TimeZone zones[] = new TimeZone[ZONES.length];
for(int z = 0; z < ZONES.length; z += 1) {
zones[z] = TimeZone.getTimeZone(ZONES[z]);
}
return zones;
}
@Override
public boolean hasSameBehavior(Object a, Object b)
{
TimeZone zone_a = (TimeZone) a;
@ -122,89 +125,91 @@ public class SerializableTestUtility {
return bSame;
}
}
private static Locale locales[] = {
Locale.CANADA, Locale.CANADA_FRENCH, Locale.CHINA,
Locale.CHINESE, Locale.ENGLISH, Locale.FRANCE, Locale.FRENCH,
Locale.GERMAN, Locale.GERMANY, Locale.ITALIAN, Locale.ITALY,
Locale.JAPAN, Locale.JAPANESE, Locale.KOREA, Locale.KOREAN,
Locale.PRC, Locale.SIMPLIFIED_CHINESE, Locale.TAIWAN,
Locale.CANADA, Locale.CANADA_FRENCH, Locale.CHINA,
Locale.CHINESE, Locale.ENGLISH, Locale.FRANCE, Locale.FRENCH,
Locale.GERMAN, Locale.GERMANY, Locale.ITALIAN, Locale.ITALY,
Locale.JAPAN, Locale.JAPANESE, Locale.KOREA, Locale.KOREAN,
Locale.PRC, Locale.SIMPLIFIED_CHINESE, Locale.TAIWAN,
Locale.TRADITIONAL_CHINESE, Locale.UK, Locale.US
};
private static Locale places[] = {
Locale.CANADA, Locale.CANADA_FRENCH, Locale.CHINA,
Locale.FRANCE, Locale.GERMANY, Locale.ITALY,
Locale.JAPAN, Locale.KOREA, Locale.PRC, Locale.TAIWAN,
Locale.CANADA, Locale.CANADA_FRENCH, Locale.CHINA,
Locale.FRANCE, Locale.GERMANY, Locale.ITALY,
Locale.JAPAN, Locale.KOREA, Locale.PRC, Locale.TAIWAN,
Locale.UK, Locale.US
};
public static Locale[] getLocales()
{
return locales;
}
public static boolean compareStrings(String a[], String b[])
{
if (a.length != b.length) {
return false;
}
for (int i = 0; i < a.length; i += 1) {
if (! a[i].equals(b[i])) {
return false;
}
}
return true;
}
public static boolean compareChars(char a[], char b[])
{
if (a.length != b.length) {
return false;
}
for (int i = 0; i < a.length; i += 1) {
if (a[i] != b[i]) {
return false;
}
}
return true;
}
private static class SimpleTimeZoneHandler extends TimeZoneHandler
{
@Override
public Object[] getTestObjects()
{
SimpleTimeZone simpleTimeZones[] = new SimpleTimeZone[6];
simpleTimeZones[0] = new SimpleTimeZone(32400000, "MyTimeZone");
simpleTimeZones[1] = new SimpleTimeZone(32400000, "Asia/Tokyo");
simpleTimeZones[2] = new SimpleTimeZone(32400000, "Asia/Tokyo");
simpleTimeZones[2].setRawOffset(0);
simpleTimeZones[3] = new SimpleTimeZone(32400000, "Asia/Tokyo");
simpleTimeZones[3].setStartYear(100);
simpleTimeZones[4] = new SimpleTimeZone(32400000, "Asia/Tokyo");
simpleTimeZones[4].setStartYear(1000);
simpleTimeZones[4].setDSTSavings(1800000);
simpleTimeZones[4].setStartRule(3, 4, 180000);
simpleTimeZones[4].setEndRule(6, 3, 4, 360000);
simpleTimeZones[5] = new SimpleTimeZone(32400000, "Asia/Tokyo");
simpleTimeZones[5].setStartRule(2, 3, 4, 360000);
simpleTimeZones[5].setEndRule(6, 3, 4, 360000);
return simpleTimeZones;
}
}
private static class VTimeZoneHandler extends TimeZoneHandler {
@Override
public Object[] getTestObjects() {
//TODO
VTimeZone[] vtzs = new VTimeZone[1];
@ -218,11 +223,11 @@ public class SerializableTestUtility {
new AnnualTimeZoneRule("EST", -5*HOUR, 0,
new DateTimeRule(Calendar.OCTOBER, -1, Calendar.SUNDAY, 2*HOUR, DateTimeRule.WALL_TIME),
1967, 2006),
new AnnualTimeZoneRule("EST", -5*HOUR, 0,
new DateTimeRule(Calendar.NOVEMBER, 1, Calendar.SUNDAY, true, 2*HOUR, DateTimeRule.WALL_TIME),
2007, AnnualTimeZoneRule.MAX_YEAR),
new AnnualTimeZoneRule("EDT", -5*HOUR, 1*HOUR,
new DateTimeRule(Calendar.APRIL, -1, Calendar.SUNDAY, 2*HOUR, DateTimeRule.WALL_TIME),
1967, 1973),
@ -250,6 +255,7 @@ public class SerializableTestUtility {
private static class RuleBasedTimeZoneHandler extends TimeZoneHandler
{
@Override
public Object[] getTestObjects()
{
RuleBasedTimeZone ruleBasedTimeZones[] = new RuleBasedTimeZone[2];
@ -270,6 +276,7 @@ public class SerializableTestUtility {
}
private static class DateTimeRuleHandler implements Handler {
@Override
public Object[] getTestObjects() {
DateTimeRule[] rules = new DateTimeRule[4];
@ -288,6 +295,7 @@ public class SerializableTestUtility {
return rules;
}
@Override
public boolean hasSameBehavior(Object a, Object b) {
return hasSameRule((DateTimeRule)a, (DateTimeRule)b);
}
@ -313,7 +321,7 @@ public class SerializableTestUtility {
break;
}
}
return bSame;
return bSame;
}
}
@ -323,14 +331,16 @@ public class SerializableTestUtility {
ra.getDSTSavings() == rb.getDSTSavings()) {
return true;
}
return false;
return false;
}
private static class AnnualTimeZoneRuleHandler implements Handler {
@Override
public Object[] getTestObjects() {
return TEST_US_EASTERN;
}
@Override
public boolean hasSameBehavior(Object a, Object b) {
AnnualTimeZoneRule ra = (AnnualTimeZoneRule)a;
AnnualTimeZoneRule rb = (AnnualTimeZoneRule)b;
@ -344,6 +354,7 @@ public class SerializableTestUtility {
}
private static class InitialTimeZoneRuleHandler implements Handler {
@Override
public Object[] getTestObjects() {
TimeZoneRule[] rules = new TimeZoneRule[2];
rules[0] = new InitialTimeZoneRule("EST", -5*HOUR, 0);
@ -351,12 +362,14 @@ public class SerializableTestUtility {
return rules;
}
@Override
public boolean hasSameBehavior(Object a, Object b) {
return compareTimeZoneRules((TimeZoneRule)a, (TimeZoneRule)b);
}
}
private static class TimeArrayTimeZoneRuleHandler implements Handler {
@Override
public Object[] getTestObjects() {
TimeArrayTimeZoneRule[] rules = new TimeArrayTimeZoneRule[1];
long[] ttime = new long[] {-631152000000L, 0L, 946684800000L}; /* {1950-1-1, 1970-1-1, 2000-1-1} */
@ -364,6 +377,7 @@ public class SerializableTestUtility {
return rules;
}
@Override
public boolean hasSameBehavior(Object a, Object b) {
TimeArrayTimeZoneRule ra = (TimeArrayTimeZoneRule)a;
TimeArrayTimeZoneRule rb = (TimeArrayTimeZoneRule)b;
@ -393,36 +407,40 @@ public class SerializableTestUtility {
private static class ULocaleHandler implements Handler
{
@Override
public Object[] getTestObjects()
{
ULocale uLocales[] = new ULocale[locales.length];
for (int i = 0; i < locales.length; i += 1) {
uLocales[i] = ULocale.forLocale(locales[i]);
}
return uLocales;
}
@Override
public boolean hasSameBehavior(Object a, Object b)
{
ULocale uloc_a = (ULocale) a;
ULocale uloc_b = (ULocale) b;
return uloc_a.getName().equals(uloc_b.getName());
}
}
public static class DateIntervalHandler implements Handler
{
private DateInterval dateInterval[] = {
new DateInterval(0L, 1164931200000L/*20061201T000000Z*/)
};
@Override
public Object[] getTestObjects()
{
return dateInterval;
}
@Override
public boolean hasSameBehavior(Object a, Object b)
{
return a.equals(b);
@ -431,28 +449,30 @@ public class SerializableTestUtility {
private static class CurrencyHandler implements Handler
{
@Override
public Object[] getTestObjects()
{
Currency currencies[] = new Currency[places.length];
for (int i = 0; i < places.length; i += 1) {
currencies[i] = Currency.getInstance(places[i]);
}
return currencies;
}
@Override
public boolean hasSameBehavior(Object a, Object b)
{
Currency curr_a = (Currency) a;
Currency curr_b = (Currency) b;
return a == b
|| a != null && b != null
return a == b
|| a != null && b != null
&& curr_a.getCurrencyCode() != null
&& curr_a.getCurrencyCode().equals(curr_b.getCurrencyCode());
}
}
@ -464,7 +484,7 @@ public class SerializableTestUtility {
"Europe/Amsterdam", "Europe/Athens", "Europe/Berlin", "Europe/London", "Europe/Malta", "Europe/Moscow",
"Europe/Paris", "Europe/Rome"
};
private static long sampleTimes[] = {
1136073600000L, // 20060101T000000Z
1138752000000L, // 20060201T000000Z
@ -482,18 +502,20 @@ public class SerializableTestUtility {
private static class OlsonTimeZoneHandler implements Handler
{
@Override
public Object[] getTestObjects()
{
OlsonTimeZone timeZones[] = new OlsonTimeZone[zoneIDs.length];
for (int i = 0; i < zoneIDs.length; i += 1) {
timeZones[i] = new OlsonTimeZone(zoneIDs[i]);
}
return timeZones;
}
@Override
public boolean hasSameBehavior(Object a, Object b)
{
OlsonTimeZone otz_a = (OlsonTimeZone) a;
@ -516,24 +538,26 @@ public class SerializableTestUtility {
private static class TimeZoneAdapterHandler implements Handler
{
@Override
public Object[] getTestObjects()
{
TimeZoneAdapter timeZones[] = new TimeZoneAdapter[zoneIDs.length];
for (int i = 0; i < zoneIDs.length; i += 1) {
timeZones[i] = new TimeZoneAdapter(TimeZone.getTimeZone(zoneIDs[i]));
}
return timeZones;
}
@Override
public boolean hasSameBehavior(Object a, Object b)
{
GregorianCalendar cal = new GregorianCalendar();
TimeZoneAdapter tza_a = (TimeZoneAdapter) a;
TimeZoneAdapter tza_b = (TimeZoneAdapter) b;
int a_offset, b_offset;
boolean a_dst, b_dst;
boolean bSame = true;
@ -562,6 +586,7 @@ public class SerializableTestUtility {
private static class JavaTimeZoneHandler implements Handler {
String[] ZONES = { "GMT", "America/New_York", "GMT+05:45" };
@Override
public Object[] getTestObjects() {
JavaTimeZone zones[] = new JavaTimeZone[ZONES.length];
for(int z = 0; z < ZONES.length; z += 1) {
@ -570,7 +595,8 @@ public class SerializableTestUtility {
}
return zones;
}
@Override
public boolean hasSameBehavior(Object a, Object b)
{
TimeZone zone_a = (TimeZone) a;
@ -610,26 +636,28 @@ public class SerializableTestUtility {
"12.34567890",
"1.234567890",
".1234567890"};
@Override
public Object[] getTestObjects()
{
BigDecimal bds[] = new BigDecimal[values.length];
for (int i = 0; i < values.length; i += 1) {
bds[i] = new BigDecimal(values[i]);
}
return bds;
}
@Override
public boolean hasSameBehavior(Object a, Object b) {
BigDecimal bda = (BigDecimal) a;
BigDecimal bdb = (BigDecimal) b;
return bda.toString().equals(bdb.toString());
}
}
private static class MathContextHandler implements Handler
{
int forms[] = {MathContext.PLAIN, MathContext.ENGINEERING, MathContext.SCIENTIFIC};
@ -638,41 +666,44 @@ public class SerializableTestUtility {
MathContext.ROUND_HALF_DOWN, MathContext.ROUND_HALF_EVEN, MathContext.ROUND_HALF_UP,
MathContext.ROUND_UNNECESSARY, MathContext.ROUND_UP};
@Override
public Object[] getTestObjects()
{
int objectCount = forms.length * rounds.length;
MathContext contexts[] = new MathContext[objectCount];
int i = 0;
for (int f = 0; f < forms.length; f += 1) {
for (int r = 0; r < rounds.length; r += 1) {
int digits = f * r;
boolean lostDigits = (r & 1) != 0;
contexts[i++] = new MathContext(digits, forms[f], lostDigits, rounds[r]);
}
}
return contexts;
}
@Override
public boolean hasSameBehavior(Object a, Object b)
{
MathContext mca = (MathContext) a;
MathContext mcb = (MathContext) b;
return mca.toString().equals(mcb.toString());
}
}
private static abstract class ExceptionHandlerBase implements Handler {
@Override
public boolean hasSameBehavior(Object a, Object b) {
return sameThrowable((Exception) a, (Exception) b);
}
// Exception.equals() does not seem to work.
private static final boolean sameThrowable(Throwable a, Throwable b) {
return a == null ? b == null :
return a == null ? b == null :
b == null ? false :
a.getClass().equals(b.getClass()) &&
Utility.objectEquals(a.getMessage(), b.getMessage()) &&
@ -681,6 +712,7 @@ public class SerializableTestUtility {
}
private static class ICUExceptionHandler extends ExceptionHandlerBase {
@Override
public Object[] getTestObjects() {
return new ICUException[] {
new ICUException(),
@ -692,6 +724,7 @@ public class SerializableTestUtility {
}
private static class ICUUncheckedIOExceptionHandler extends ExceptionHandlerBase {
@Override
public Object[] getTestObjects() {
return new ICUUncheckedIOException[] {
new ICUUncheckedIOException(),
@ -703,6 +736,7 @@ public class SerializableTestUtility {
}
private static class ICUCloneNotSupportedExceptionHandler extends ExceptionHandlerBase {
@Override
public Object[] getTestObjects() {
return new ICUCloneNotSupportedException[] {
new ICUCloneNotSupportedException(),
@ -714,7 +748,7 @@ public class SerializableTestUtility {
}
private static HashMap map = new HashMap();
static {
map.put("com.ibm.icu.util.TimeZone", new TimeZoneHandler());
map.put("com.ibm.icu.util.SimpleTimeZone", new SimpleTimeZoneHandler());
@ -731,7 +765,7 @@ public class SerializableTestUtility {
map.put("com.ibm.icu.impl.TimeZoneAdapter", new TimeZoneAdapterHandler());
map.put("com.ibm.icu.math.BigDecimal", new BigDecimalHandler());
map.put("com.ibm.icu.math.MathContext", new MathContextHandler());
map.put("com.ibm.icu.text.NumberFormat", new FormatHandler.NumberFormatHandler());
map.put("com.ibm.icu.text.DecimalFormat", new FormatHandler.DecimalFormatHandler());
map.put("com.ibm.icu.text.CompactDecimalFormat", new FormatHandler.CompactDecimalFormatHandler());
@ -772,7 +806,7 @@ public class SerializableTestUtility {
map.put("com.ibm.icu.util.JapaneseCalendar", new CalendarHandler.JapaneseCalendarHandler());
map.put("com.ibm.icu.util.PersianCalendar", new CalendarHandler.PersianCalendarHandler());
map.put("com.ibm.icu.util.TaiwanCalendar", new CalendarHandler.TaiwanCalendarHandler());
map.put("com.ibm.icu.text.ArabicShapingException", new ExceptionHandler.ArabicShapingExceptionHandler());
map.put("com.ibm.icu.text.StringPrepParseException", new ExceptionHandler.StringPrepParseExceptionHandler());
map.put("com.ibm.icu.util.UResourceTypeMismatchException", new ExceptionHandler.UResourceTypeMismatchExceptionHandler());
@ -798,7 +832,7 @@ public class SerializableTestUtility {
map.put("com.ibm.icu.util.ICUUncheckedIOException", new ICUUncheckedIOExceptionHandler());
map.put("com.ibm.icu.util.ICUCloneNotSupportedException", new ICUCloneNotSupportedExceptionHandler());
}
/*
* Serialization Helpers
*/
@ -829,6 +863,17 @@ public class SerializableTestUtility {
return objects;
}
static byte[] copyStreamBytes(InputStream is) throws IOException {
byte[] buffer = new byte[1024];
ByteArrayOutputStream bos = new ByteArrayOutputStream();
int len;
while((len = is.read(buffer, 0, buffer.length)) >= 0) {
bos.write(buffer, 0, len);
}
return bos.toByteArray();
}
static List<String> getSerializationClassList(Object caller) throws IOException {
List<String> classList = new ArrayList();
Enumeration<URL> urlEnum = caller.getClass().getClassLoader().getResources("com/ibm/icu");
@ -842,8 +887,6 @@ public class SerializableTestUtility {
CoverageClassVisitor visitor = new CoverageClassVisitor(classList);
handler.guide(visitor, true, false);
}
// TODO(junit): add randomization support on the list based on the params object
return classList;
}
@ -853,7 +896,7 @@ public class SerializableTestUtility {
public CoverageClassVisitor(List<String> classNamesList) {
this.classNames = classNamesList;
}
/* (non-Javadoc)
* @see com.ibm.icu.impl.URLHandler.URLVisitor#visit(java.lang.String)
*/
@ -881,7 +924,7 @@ public class SerializableTestUtility {
// Known Issue: "10268", "Serializable interface is not implemented in PluralRules$FixedDecimal"
return;
}
if (c.isEnum() || !serializable.isAssignableFrom(c)) {
//System.out.println("@@@ Skipping: " + className);
return;
@ -891,8 +934,8 @@ public class SerializableTestUtility {
return;
}
this.classNames.add(className);
}
this.classNames.add(className);
}
}
public static void serializeObjects(File oof, Object[] objectsOut) throws IOException {
@ -900,6 +943,6 @@ public class SerializableTestUtility {
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(objectsOut);
oos.close();
oos.close();
}
}

View File

@ -16,23 +16,24 @@ import java.net.URL;
import java.util.List;
import com.ibm.icu.dev.test.serializable.SerializableTestUtility.Handler;
import com.ibm.icu.util.TimeZone;
import com.ibm.icu.util.VersionInfo;
/**
* This class writes the test objects for each class to a file. The work is
* actually done by the superclass, CoverageTest. This class just constructs
* a CoverageTest w/ a non-null path, which tells it to write the data.
*
*
*/
public class SerializableWriter
{
String path;
public SerializableWriter(String path)
{
this.path = path;
}
private static String folderName()
{
int major = VersionInfo.ICU_VERSION.getMajor();
@ -40,21 +41,21 @@ public class SerializableWriter
int milli = VersionInfo.ICU_VERSION.getMilli();
int micro = VersionInfo.ICU_VERSION.getMicro();
StringBuffer result = new StringBuffer("ICU_");
result.append(major);
result.append(".");
result.append(minor);
if (milli != 0 || micro != 0) {
result.append(".");
result.append(milli);
if (micro != 0) {
result.append(".");
result.append(micro);
}
}
return result.toString();
}
@ -67,11 +68,16 @@ public class SerializableWriter
} else {
outDir = args[0] + "/" + folderName();
}
// Override default TimeZone, so serialized data always use
// the consistent zone if not specified.
TimeZone.setDefault(TimeZone.getTimeZone("America/Los_Angeles"));
SerializableWriter writer = new SerializableWriter(outDir);
writer.serialize();
}
public void serialize() throws IOException {
File outDir = new File(this.path);
if (!outDir.exists()) {

View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:2e076133fbfb1fa01df3515276900f0d813d218fc3f3659e61f0fa8360d4db41
size 2602

View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:d46a8bf51841a49ecd7e6aacd3a24a33a435e93d624be020286ab560bdb56cc3
size 858

View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:007f10d179c32c17a62c1e021e3ee1381507c666472b54c31a9e72682bafa734
size 2821

View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:3b71a1aa6334661bafe78b40cdd292172639a4983f620a6aeafd8157451010fd
size 2543

View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:d7ba49ddbe1ad869e09c92ada38237971c4c1c8de16ab8769ddde3f9188247e3
size 20881

View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:1c14ed2e27b5f6556750e42125976c5a027371bea9d0965f6aac091f65da1e68
size 11745

View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:8608e66b6546ae9f6bb85d79b4b3beca87ab638f29d7df33e0caaebba54a6e23
size 277

View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:9ab6c8736be1b77c7a1b7665d2feb013c00072e4b11c6cea44cdec9f645d6e5f
size 21314

View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:b8ef55074e7991297b91ac7380f700f51d18690ee28fe7499d1381b39b0ea2d3
size 407

View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:812d83205f06d1db97d0819087505a54d6950156cae86d828be0badbfbfc23f0
size 237

View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:be22e604c7544d27c107537930361e3526870a26c1a249e2d9f41ddc1d3239f5
size 383

View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:2ceb146db0a66f1a8d06786791d5dbd25d6fd2f426e05f97d574db36b36638f1
size 873

View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:f98076a5c5a606c20e2a049bdcf0ab2e615c54ee8e54d5757fb5c098b90d1273
size 520

View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:57a0769d52aeb561113d877592e03a42106ea2a80ec7b59ebb812deb7788c170
size 595

View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:690b4fe479e544675e35e16712620911f1a53e43d20e702b27dfdfa3c0e83e56
size 2821

View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:db0685c5127565fd7ce341056104753b6599826d54d06fde4f9e4f2bd734544f
size 312

View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:10de87551bd60bd9fba29753d5b2a2bf632210369d780e7ab8989b7b3f129048
size 92518

View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:3d5beee0e054eb94606e71559f7ec316d6feae409e4c6aec7599e7c570065f15
size 39846

View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:125293c45e05b468166d42e25fef4dad72989bf8a60003b70e9f266788bde4fd
size 65

View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:a55aa52c6c1edf080da6c13e5e2a8d285cff872a1e3a73365891a6f23ce3c708
size 1186

View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:e237efb9ce85357480d9dd5d8d0911ce008744c51778c42e21c9d206a8252095
size 792

View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:1471904e4c84ce2bc2047d24618aa52901be0166bb7d39636799a7836846332c
size 47091

View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:a6d4d03f175b168e78b142747b523ed85583e239a72cda1ea8529ec29426ab19
size 31740

View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:438a0452ca86ab03d6ecc5d04911b99d3a787a66f3f9259bb01a30943491bbec
size 10974

View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:2b5593c919fb29bab1d8ca90b6bd69db8669386ec4088da85b8a8ec93d1d8acd
size 270

View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:875bb8966aff03b29eac45bf77914c14365ffb416d7c61da37098372c6bc9160
size 568

View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:1b034a3f554a6fa60e385d9066b9daa5c4f0b0d732c7bbb1dbb2611273480e0d
size 12451

View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:36af0d2ba0e418fa1c9ceb7586e0b7567ceadc34c5d229fd2b20b79acac0a916
size 7109

View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:fa437a891f5d947c988592f56888cb96fbda9f97719f49e73a19851111f3ed89
size 4044

View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:9a6147211fa9bf91b682c75e5bf6609143e9b41ff952f3349fb05833dc798584
size 249

View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:8c204a5460c44ab7be5a2070b6250f03cdb3e3a65ebdd257949fac2c6dda3150
size 382

View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:00baeb776002e737189513debb0d9634dcdf6821a55f9d138ddd207d5bdd90b6
size 449

View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:a3cf26862ce0858125089315303321a9dbd3c6d14023db139f2183d6b02268c2
size 4738

View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:194e815fdd82aa71706ecc30d956a4b989479abad909f6aae2be6c8d4e6f1953
size 3853

View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:a83cb51352d9b291a9e527e4fe3e8d5392a340ba0d1544d65bd9d0dd8b642026
size 872

View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:3e41842affa91bd0d5aef2bd95f546d22fdff59f32181bfc6cd50ac788a0ffdd
size 44566

View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:f75aa31550301ece69b7ed355f8b3414b73e6cf5e6ce8bd1b1bd7e4aec61156b
size 202

View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:39d2494df3dcc26a103a88e341e0765008b34bb5d6b31867a50f70fa05c9c96f
size 90967

View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:65a8af42fdd81a7b0dfaf8c42016b1a16aae58390a902f4be4e385928cddbbb5
size 7356

View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:fee16b9a8376b7b8d4436f302e12be17683ce3f4242d104c0eaee0b9fb58916c
size 3497

View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:ee4276e3758d856a8c17d99a7b8d54e7aa75687ba0b20203aaa77be6d33df3ec
size 774

View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:0b2e5cb7636e2141e6d937d0fdf2d3b824a4319ece4c2b1bfd294299519d6987
size 898

View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:10c21e3231036ccc5f75ce5020209c8e5c6dd3eac8629ffd46a239577c56b457
size 2672

View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:c81ad0fb06808843b155c6728f16e8eb41e4980b8e23023bfba16dc76d376604
size 4090

View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:34227de2543ddb4465321ebfdec9d0534f42320dca2ffa379d05c15cddf68c74
size 3152

View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:23aecc677159bdd4eaae83c2a46ced6c7612a2b47f1b8c7b5e96bd5127f79e39
size 3328

View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:e69c5ec7b30b43892842f01c23b163ae2f5b28251d541c7930a6b25cd097d898
size 345

View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:00464957f1e2baafdf2fb1dce9ea0badc34931691d10f9de1e667ee0c41f1d31
size 3538

View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:23ea1aac56dc3581502d59b006be4e963c0dcf7d7fa9d205480523c5c2c9b34a
size 139

View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:95e547b62781546a7fa18adbb52bb14a39f766f24c3f136789504cd32d72570b
size 324

View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:d56d0e24f773828f946a36c185fce7b32ea3aaa8aa615e801bc5d9568aab4a6d
size 2621

View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:6bd5cb471c0acd397450a83df5c78d4b8036caf17f7b62f8b624fc67983c5df5
size 4099

View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:e23d53e994cdc71874877aa5503d882f82499a00db006640d379a43abc7b27df
size 3647

View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:60ea769bec61fb4027207f3fd7032ddae50ad0bbde57994819e6f68d90f9a6b6
size 1393

View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:d521366ed6b5f5ee0165cf84a218d6f530ceb1d7bbec46a5a8f9f01aafc9d7aa
size 1298

View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:c292e0ef621dee820a3c788b48f1b888e368b7dd0e4e7f5af516035f9c192193
size 1331

View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:d7de8827353dc30a9d1470d9f8919d67cc31f4e0856cf071b936c5e794a9a1c4
size 923

View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:fc560e256e8b79c84a6c069c0703ac760b00da74ed4a7a22331d876f86027957
size 2493

View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:5e87a78c208e64f9a1a791d6a207f1372700b8cb66e8c06296d3ca918bb8d115
size 241

View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:ae24712c0aeb231fcfb54c4c4f0e39eb05286d590c15803484ea766e6a57c2b0
size 3876

View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:cb31552ed16ceed9847bbcb99f559038a7f39717262210cca391504ac7bf4043
size 2750

View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:20e3c8b651ca2b9706c4f15d3c2a06821bebbe9e797a87acad6e236089e520af
size 173

View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:44079dbb9fc299f7b58a4fae18076ef255341c87c5e6b208839433f849e796da
size 3664

View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:f811ee6e4cd76878e700c3eafb0627b3b0cb0524668dc844b0c9b055e649e682
size 1401

View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:09693cbb7c8d078a5d9696dda0a410916c41f2503320ba76e7d3449b996d8e26
size 1152

View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:9ae9f999dccc91e30783dc41207b216529e2cc1c0a916d3aa04ff153535cac8c
size 2821

View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:250f185d9bedd33f314c4e04498c43f9c5d921a086fae76b720e53b23db6b822
size 312

View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:20e3c8b651ca2b9706c4f15d3c2a06821bebbe9e797a87acad6e236089e520af
size 173

View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:a6f6ba35d524dd1f2ad021a4283812432f27a6654abc376364f90dbba036c0f3
size 1588

View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:2097a6ceea62f53f9176b507ba431c7a379d5fc5d33f8b5f123dfb9e3b37246d
size 365

View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:dbbe1553bda6ba60b97f950f2baa4974317a7dc8f4481886b51fa780839d58df
size 2886

View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:d5dfdb001674451c65fd2e84654ca8ecee73f6f015bf42721e9aaa6f480b9b4b
size 2676