# HG changeset patch # User naoto # Date 1568217003 25200 # Node ID d52f77f0acb503f2da89021334f34e2dbca98cc3 # Parent cddef3bde924f3ff4f17f3d369280cf69d0450e5 8230136: DateTimeFormatterBuilder.FractionPrinterParser#parse fails to verify minWidth Reviewed-by: joehw, scolebourne, rriggs diff -r cddef3bde924 -r d52f77f0acb5 src/java.base/share/classes/java/time/format/DateTimeFormatterBuilder.java --- a/src/java.base/share/classes/java/time/format/DateTimeFormatterBuilder.java Wed Sep 11 14:16:30 2019 +0200 +++ b/src/java.base/share/classes/java/time/format/DateTimeFormatterBuilder.java Wed Sep 11 08:50:03 2019 -0700 @@ -306,7 +306,7 @@ /** * Changes the parse style to be strict for the remainder of the formatter. *

- * Parsing can be strict or lenient - by default its strict. + * Parsing can be strict or lenient - by default it is strict. * This controls the degree of flexibility in matching the text and sign styles. *

* When used, this method changes the parsing to be strict from this point onwards. @@ -325,7 +325,7 @@ * Changes the parse style to be lenient for the remainder of the formatter. * Note that case sensitivity is set separately to this method. *

- * Parsing can be strict or lenient - by default its strict. + * Parsing can be strict or lenient - by default it is strict. * This controls the degree of flexibility in matching the text and sign styles. * Applications calling this method should typically also call {@link #parseCaseInsensitive()}. *

@@ -3200,7 +3200,7 @@ char ch = text.charAt(pos++); int digit = context.getDecimalStyle().convertToDigit(ch); if (digit < 0) { - if (pos < minEndPos) { + if (pos <= minEndPos) { return ~position; // need at least min width digits } pos--; diff -r cddef3bde924 -r d52f77f0acb5 test/jdk/java/time/test/java/time/format/TestFractionPrinterParser.java --- a/test/jdk/java/time/test/java/time/format/TestFractionPrinterParser.java Wed Sep 11 14:16:30 2019 +0200 +++ b/test/jdk/java/time/test/java/time/format/TestFractionPrinterParser.java Wed Sep 11 08:50:03 2019 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -59,6 +59,7 @@ */ package test.java.time.format; +import static java.time.temporal.ChronoField.MILLI_OF_SECOND; import static java.time.temporal.ChronoField.NANO_OF_SECOND; import static java.time.temporal.ChronoField.SECOND_OF_MINUTE; import static org.testng.Assert.assertEquals; @@ -77,6 +78,8 @@ /** * Test FractionPrinterParser. + * + * @bug 8230136 */ @Test public class TestFractionPrinterParser extends AbstractTestPrinterParser { @@ -331,6 +334,24 @@ assertEquals(parsed, null); } + @DataProvider(name="ParseMinWidth") + Object[][] provider_parseMinWidth() { + return new Object[][] { + {MILLI_OF_SECOND, 3, 3, true, ".1x"}, + {MILLI_OF_SECOND, 3, 3, true, ".12x"}, + {MILLI_OF_SECOND, 3, 3, true, ".1234x"}, + }; + } + + @Test(dataProvider="ParseMinWidth", expectedExceptions=DateTimeException.class) + public void test_parse_minWidth(TemporalField field, int min, int max, boolean decimalPoint, String text) throws Exception { + builder + .appendFraction(field, min, max, decimalPoint) + .appendLiteral("x") + .toFormatter(locale) + .parse(text); + } + //----------------------------------------------------------------------- public void test_toString() throws Exception { assertEquals(getFormatter(NANO_OF_SECOND, 3, 6, true).toString(), "Fraction(NanoOfSecond,3,6,DecimalPoint)");