8230136: DateTimeFormatterBuilder.FractionPrinterParser#parse fails to verify minWidth
authornaoto
Wed, 11 Sep 2019 08:50:03 -0700
changeset 58086 d52f77f0acb5
parent 58084 cddef3bde924
child 58087 03964761a23c
8230136: DateTimeFormatterBuilder.FractionPrinterParser#parse fails to verify minWidth Reviewed-by: joehw, scolebourne, rriggs
src/java.base/share/classes/java/time/format/DateTimeFormatterBuilder.java
test/jdk/java/time/test/java/time/format/TestFractionPrinterParser.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.
      * <p>
-     * 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.
      * <p>
      * 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.
      * <p>
-     * 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()}.
      * <p>
@@ -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--;
--- 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)");