Benedikt, Expletive, I wasn't being careful. The changes to FieldUtilsTest are to allow test to pass under jacoco coverage.
I will revert, add another JIRA, fix changed.xml, and split into two commits tonight. Chas > On Apr 6, 2015, at 11:29 PM, Benedikt Ritter <[email protected]> wrote: > > Hello Charles, > > looks like things got missed up. The Log messages takes about LANG-1109, > but LANG-1107 was added to changes.xml. > Furthermore there is a change in FieldUtilsTest. How does this relate to > either of the issues? > > Regards, > Benedikt > > 2015-04-07 4:40 GMT+02:00 <[email protected]>: > >> Author: chas >> Date: Tue Apr 7 02:40:49 2015 >> New Revision: 1671734 >> >> URL: http://svn.apache.org/r1671734 >> Log: >> LANG-1109 - Number percentage formatting with fractional digits >> >> Modified: >> commons/proper/lang/trunk/src/changes/changes.xml >> >> commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/time/FastDateParser.java >> >> commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/reflect/FieldUtilsTest.java >> >> commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/time/FastDateParserSDFTest.java >> >> commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/time/FastDateParserTest.java >> >> Modified: commons/proper/lang/trunk/src/changes/changes.xml >> URL: >> http://svn.apache.org/viewvc/commons/proper/lang/trunk/src/changes/changes.xml?rev=1671734&r1=1671733&r2=1671734&view=diff >> >> ============================================================================== >> --- commons/proper/lang/trunk/src/changes/changes.xml [utf-8] (original) >> +++ commons/proper/lang/trunk/src/changes/changes.xml [utf-8] Tue Apr 7 >> 02:40:49 2015 >> @@ -22,7 +22,7 @@ >> <body> >> >> <release version="3.5" date="tba" description="tba"> >> - >> + <action issue="LANG-1107" type="update" dev="chas">Fix parsing edge >> cases in FastDateParser</action> >> </release> >> >> <release version="3.4" date="2014-04-06" description="Feature and >> bugfix release"> >> >> Modified: >> commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/time/FastDateParser.java >> URL: >> http://svn.apache.org/viewvc/commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/time/FastDateParser.java?rev=1671734&r1=1671733&r2=1671734&view=diff >> >> ============================================================================== >> --- >> commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/time/FastDateParser.java >> (original) >> +++ >> commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/time/FastDateParser.java >> Tue Apr 7 02:40:49 2015 >> @@ -744,9 +744,13 @@ public class FastDateParser implements D >> /** >> * A strategy that handles a timezone field in the parsing pattern >> */ >> - private static class TimeZoneStrategy extends Strategy { >> - >> - private final String validTimeZoneChars; >> + static class TimeZoneStrategy extends Strategy { >> + private static final String RFC_822_TIME_ZONE = "[+-]\\d{4}"; >> + private static final String GMT_OPTION= "GMT[+-]\\d{1,2}:\\d{2}"; >> + // see http://www.iana.org/time-zones and >> http://cldr.unicode.org/translation/timezones >> + static final String TZ_DATABASE= >> "(?:\\p{L}[\\p{L}\\p{Mc}\\p{Nd}\\p{Zs}\\p{P}&&[^-]]*-?\\p{Zs}?)*"; >> + private static final String VALID_TZ = >> "((?iu)"+RFC_822_TIME_ZONE+"|"+GMT_OPTION+"|"+TZ_DATABASE+")"; >> + >> private final SortedMap<String, TimeZone> tzNames= new >> TreeMap<String, TimeZone>(String.CASE_INSENSITIVE_ORDER); >> >> /** >> @@ -777,9 +781,6 @@ public class FastDateParser implements D >> TimeZoneStrategy(final Locale locale) { >> final String[][] zones = >> DateFormatSymbols.getInstance(locale).getZoneStrings(); >> for (final String[] zone : zones) { >> - if (zone[ID].startsWith("GMT")) { >> - continue; >> - } >> final TimeZone tz = TimeZone.getTimeZone(zone[ID]); >> if (!tzNames.containsKey(zone[LONG_STD])){ >> tzNames.put(zone[LONG_STD], tz); >> @@ -795,16 +796,7 @@ public class FastDateParser implements D >> tzNames.put(zone[SHORT_DST], tz); >> } >> } >> - } >> - >> - final StringBuilder sb= new StringBuilder(); >> - sb.append("(GMT[+-]\\d{1,2}:\\d{2}").append('|'); >> - sb.append("[+-]\\d{4}").append('|'); >> - for(final String id : tzNames.keySet()) { >> - escapeRegex(sb, id, false).append('|'); >> - } >> - sb.setCharAt(sb.length()-1, ')'); >> - validTimeZoneChars= sb.toString(); >> + } >> } >> >> /** >> @@ -812,7 +804,7 @@ public class FastDateParser implements D >> */ >> @Override >> boolean addRegex(final FastDateParser parser, final StringBuilder >> regex) { >> - regex.append(validTimeZoneChars); >> + regex.append(VALID_TZ); >> return true; >> } >> >> @@ -825,8 +817,8 @@ public class FastDateParser implements D >> if(value.charAt(0)=='+' || value.charAt(0)=='-') { >> tz= TimeZone.getTimeZone("GMT"+value); >> } >> - else if(value.startsWith("GMT")) { >> - tz= TimeZone.getTimeZone(value); >> + else if(value.regionMatches(true, 0, "GMT", 0, 3)) { >> + tz= TimeZone.getTimeZone(value.toUpperCase()); >> } >> else { >> tz= tzNames.get(value); >> >> Modified: >> commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/reflect/FieldUtilsTest.java >> URL: >> http://svn.apache.org/viewvc/commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/reflect/FieldUtilsTest.java?rev=1671734&r1=1671733&r2=1671734&view=diff >> >> ============================================================================== >> --- >> commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/reflect/FieldUtilsTest.java >> (original) >> +++ >> commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/reflect/FieldUtilsTest.java >> Tue Apr 7 02:40:49 2015 >> @@ -24,8 +24,8 @@ import org.junit.Test; >> import java.lang.reflect.Constructor; >> import java.lang.reflect.Field; >> import java.lang.reflect.Modifier; >> -import java.util.ArrayList; >> import java.util.Arrays; >> +import java.util.Collections; >> import java.util.List; >> >> import static org.junit.Assert.*; >> @@ -146,26 +146,36 @@ public class FieldUtilsTest { >> FieldUtils.getField(PublicChild.class, " ", true); >> } >> >> + private Field[] allPublicChildFields() { >> + Class<? super PublicChild> parentClass = >> PublicChild.class.getSuperclass(); >> + final Field[] fieldsParent = >> parentClass.getDeclaredFields(); >> + assertArrayEquals(fieldsParent, >> FieldUtils.getAllFields(parentClass)); >> + >> + final Field[] fieldsPublicChild = >> PublicChild.class.getDeclaredFields(); >> + return ArrayUtils.addAll(fieldsPublicChild, fieldsParent); >> + } >> + >> + private Field[] allIntegerFields() { >> + final Field[] fieldsNumber = Number.class.getDeclaredFields(); >> + assertArrayEquals(Number.class.getDeclaredFields(), >> FieldUtils.getAllFields(Number.class)); >> + final Field[] fieldsInteger = Integer.class.getDeclaredFields(); >> + return ArrayUtils.addAll(fieldsInteger, fieldsNumber); >> + } >> + >> @Test >> public void testGetAllFields() { >> assertArrayEquals(new Field[0], >> FieldUtils.getAllFields(Object.class)); >> - final Field[] fieldsNumber = Number.class.getDeclaredFields(); >> - assertArrayEquals(fieldsNumber, >> FieldUtils.getAllFields(Number.class)); >> - final Field[] fieldsInteger = Integer.class.getDeclaredFields(); >> - assertArrayEquals(ArrayUtils.addAll(fieldsInteger, fieldsNumber), >> FieldUtils.getAllFields(Integer.class)); >> - assertEquals(5, >> FieldUtils.getAllFields(PublicChild.class).length); >> + assertArrayEquals(allIntegerFields(), >> FieldUtils.getAllFields(Integer.class)); >> + >> + assertArrayEquals(allPublicChildFields(), >> FieldUtils.getAllFields(PublicChild.class)); >> } >> >> @Test >> public void testGetAllFieldsList() { >> - assertEquals(0, FieldUtils.getAllFieldsList(Object.class).size()); >> - final List<Field> fieldsNumber = >> Arrays.asList(Number.class.getDeclaredFields()); >> - assertEquals(fieldsNumber, >> FieldUtils.getAllFieldsList(Number.class)); >> - final List<Field> fieldsInteger = >> Arrays.asList(Integer.class.getDeclaredFields()); >> - final List<Field> allFieldsInteger = new >> ArrayList<Field>(fieldsInteger); >> - allFieldsInteger.addAll(fieldsNumber); >> - assertEquals(allFieldsInteger, >> FieldUtils.getAllFieldsList(Integer.class)); >> - assertEquals(5, >> FieldUtils.getAllFieldsList(PublicChild.class).size()); >> + assertEquals(Collections.emptyList(), >> FieldUtils.getAllFieldsList(Object.class)); >> + assertEquals(Arrays.asList(allIntegerFields()), >> FieldUtils.getAllFieldsList(Integer.class)); >> + >> + assertEquals(Arrays.asList(allPublicChildFields()), >> FieldUtils.getAllFieldsList(PublicChild.class)); >> } >> >> @Test >> >> Modified: >> commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/time/FastDateParserSDFTest.java >> URL: >> http://svn.apache.org/viewvc/commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/time/FastDateParserSDFTest.java?rev=1671734&r1=1671733&r2=1671734&view=diff >> >> ============================================================================== >> --- >> commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/time/FastDateParserSDFTest.java >> (original) >> +++ >> commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/time/FastDateParserSDFTest.java >> Tue Apr 7 02:40:49 2015 >> @@ -27,7 +27,6 @@ import java.util.Date; >> import java.util.Locale; >> import java.util.TimeZone; >> >> -import org.junit.Ignore; >> import org.junit.Test; >> import org.junit.runner.RunWith; >> import org.junit.runners.Parameterized; >> @@ -138,13 +137,11 @@ public class FastDateParserSDFTest { >> } >> >> @Test >> - @Ignore // not currently supported >> public void testLowerCase() throws Exception { >> checkParse(input.toLowerCase(locale)); >> } >> >> @Test >> - @Ignore // not currently supported >> public void testLowerCasePP() throws Exception { >> checkParsePosition(input.toLowerCase(locale)); >> } >> >> Modified: >> commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/time/FastDateParserTest.java >> URL: >> http://svn.apache.org/viewvc/commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/time/FastDateParserTest.java?rev=1671734&r1=1671733&r2=1671734&view=diff >> >> ============================================================================== >> --- >> commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/time/FastDateParserTest.java >> (original) >> +++ >> commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/time/FastDateParserTest.java >> Tue Apr 7 02:40:49 2015 >> @@ -21,6 +21,7 @@ import static org.junit.Assert.assertFal >> import static org.junit.Assert.assertTrue; >> >> import java.io.Serializable; >> +import java.text.DateFormatSymbols; >> import java.text.ParseException; >> import java.text.SimpleDateFormat; >> import java.util.Calendar; >> @@ -30,6 +31,7 @@ import java.util.HashMap; >> import java.util.Locale; >> import java.util.Map; >> import java.util.TimeZone; >> +import java.util.regex.Pattern; >> >> import org.apache.commons.lang3.SerializationUtils; >> import org.junit.Assert; >> @@ -260,21 +262,21 @@ public class FastDateParserTest { >> @Test >> public void testTzParses() throws Exception { >> // Check that all Locales can parse the time formats we use >> - for(final Locale locale : Locale.getAvailableLocales()) { >> - final FastDateParser fdp= new FastDateParser("yyyy/MM/dd >> z", TimeZone.getDefault(), locale); >> + for(final Locale locale : Locale.getAvailableLocales()) { >> + final FastDateParser fdp= new FastDateParser("yyyy/MM/dd z", >> TimeZone.getDefault(), locale); >> + >> + for(final TimeZone tz : new TimeZone[]{NEW_YORK, REYKJAVIK, >> GMT}) { >> + final Calendar cal= Calendar.getInstance(tz, locale); >> + cal.clear(); >> + cal.set(Calendar.YEAR, 2000); >> + cal.set(Calendar.MONTH, 1); >> + cal.set(Calendar.DAY_OF_MONTH, 10); >> + final Date expected= cal.getTime(); >> >> - for(final TimeZone tz : new TimeZone[]{NEW_YORK, >> REYKJAVIK, GMT}) { >> - final Calendar cal= Calendar.getInstance(tz, >> locale); >> - cal.clear(); >> - cal.set(Calendar.YEAR, 2000); >> - cal.set(Calendar.MONTH, 1); >> - cal.set(Calendar.DAY_OF_MONTH, 10); >> - final Date expected= cal.getTime(); >> - >> - final Date actual = fdp.parse("2000/02/10 >> "+tz.getDisplayName(locale)); >> - Assert.assertEquals("tz:"+tz.getID()+" >> locale:"+locale.getDisplayName(), expected, actual); >> - } >> - } >> + final Date actual = fdp.parse("2000/02/10 >> "+tz.getDisplayName(locale)); >> + Assert.assertEquals("tz:"+tz.getID()+" >> locale:"+locale.getDisplayName(), expected, actual); >> + } >> + } >> } >> >> >> @@ -640,4 +642,19 @@ public class FastDateParserTest { >> } >> } >> >> + @Test >> + public void testTimeZoneStrategyPattern() { >> + Pattern tz = >> Pattern.compile(FastDateParser.TimeZoneStrategy.TZ_DATABASE); >> + Assert.assertFalse(tz.matcher("GMT-1234").matches()); >> + >> + for (Locale locale : Locale.getAvailableLocales()) { >> + final String[][] zones = >> DateFormatSymbols.getInstance(locale).getZoneStrings(); >> + for (final String[] zone : zones) { >> + for (String zoneExpr : zone) { >> + Assert.assertTrue(locale.getDisplayName() + ":" + >> zoneExpr, tz.matcher(zoneExpr).matches()); >> + } >> + } >> + } >> + } >> + >> } > > > -- > http://people.apache.org/~britter/ > http://www.systemoutprintln.de/ > http://twitter.com/BenediktRitter > http://github.com/britter --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
