This is an automated email from the ASF dual-hosted git repository.

sebb pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-validator.git


The following commit(s) were added to refs/heads/master by this push:
     new 439d3d5  VALIDATOR-444 numbers > than maxvalue are Valid
439d3d5 is described below

commit 439d3d5d372887ea92473f50f8b06b501eddf59d
Author: Sebb <s...@apache.org>
AuthorDate: Fri Jun 19 16:55:54 2020 +0100

    VALIDATOR-444 numbers > than maxvalue are Valid
    
    Ensure isIntegerOnly is set correctly for non-fractional formats
    Can then simplify processParsedValue
---
 .../routines/AbstractNumberValidator.java          |  5 ++++-
 .../commons/validator/routines/ByteValidator.java  | 14 +++++++------
 .../validator/routines/IntegerValidator.java       | 14 +++++++------
 .../commons/validator/routines/LongValidator.java  |  3 ++-
 .../validator/routines/ByteValidatorTest.java      | 20 +++++++++++++------
 .../validator/routines/IntegerValidatorTest.java   | 21 ++++++++++++++------
 .../validator/routines/LongValidatorTest.java      | 23 ++++++++++++++++------
 7 files changed, 68 insertions(+), 32 deletions(-)

diff --git 
a/src/main/java/org/apache/commons/validator/routines/AbstractNumberValidator.java
 
b/src/main/java/org/apache/commons/validator/routines/AbstractNumberValidator.java
index 8187b6e..f8c6cce 100644
--- 
a/src/main/java/org/apache/commons/validator/routines/AbstractNumberValidator.java
+++ 
b/src/main/java/org/apache/commons/validator/routines/AbstractNumberValidator.java
@@ -198,7 +198,7 @@ public abstract class AbstractNumberValidator extends 
AbstractFormatValidator {
             formatter = new DecimalFormat(pattern, symbols);
         }
 
-        if (determineScale(formatter) == 0) {
+        if (!isAllowFractions()) {
             formatter.setParseIntegerOnly(true);
         }
         return formatter;
@@ -267,6 +267,9 @@ public abstract class AbstractNumberValidator extends 
AbstractFormatValidator {
             } else {
                 formatter = NumberFormat.getInstance(locale);
             }
+            if (!isAllowFractions()) {
+                formatter.setParseIntegerOnly(true);
+            }
             break;
         }
         return formatter;
diff --git 
a/src/main/java/org/apache/commons/validator/routines/ByteValidator.java 
b/src/main/java/org/apache/commons/validator/routines/ByteValidator.java
index c7d1153..fb638ff 100644
--- a/src/main/java/org/apache/commons/validator/routines/ByteValidator.java
+++ b/src/main/java/org/apache/commons/validator/routines/ByteValidator.java
@@ -244,13 +244,15 @@ public class ByteValidator extends 
AbstractNumberValidator {
     @Override
     protected Object processParsedValue(Object value, Format formatter) {
 
-        long longValue = ((Number)value).longValue();
-
-        if (longValue < Byte.MIN_VALUE ||
-            longValue > Byte.MAX_VALUE) {
-            return null;
+        // Parsed value will be Long if it fits in a long and is not fractional
+        if (value instanceof Long) {
+            long longValue = ((Long)value).longValue();
+            if (longValue >= Byte.MIN_VALUE && 
+                longValue <= Byte.MAX_VALUE) {
+                return Byte.valueOf((byte)longValue);
+            }
         }
-        return Byte.valueOf((byte)longValue);
+        return null;
     }
 
 }
diff --git 
a/src/main/java/org/apache/commons/validator/routines/IntegerValidator.java 
b/src/main/java/org/apache/commons/validator/routines/IntegerValidator.java
index 1f31c4f..eab42bd 100644
--- a/src/main/java/org/apache/commons/validator/routines/IntegerValidator.java
+++ b/src/main/java/org/apache/commons/validator/routines/IntegerValidator.java
@@ -244,12 +244,14 @@ public class IntegerValidator extends 
AbstractNumberValidator {
     @Override
     protected Object processParsedValue(Object value, Format formatter) {
 
-        long longValue = ((Number)value).longValue();
-
-        if (longValue < Integer.MIN_VALUE ||
-            longValue > Integer.MAX_VALUE) {
-            return null;
+        // Parsed value will be Long if it fits in a long and is not fractional
+        if (value instanceof Long) {
+            long longValue = ((Long)value).longValue();
+            if (longValue >= Integer.MIN_VALUE && 
+                longValue <= Integer.MAX_VALUE) {
+                return Integer.valueOf((int)longValue);
+            }
         }
-        return Integer.valueOf((int)longValue);
+        return null;
     }
 }
diff --git 
a/src/main/java/org/apache/commons/validator/routines/LongValidator.java 
b/src/main/java/org/apache/commons/validator/routines/LongValidator.java
index fc9cb6c..9aa9657 100644
--- a/src/main/java/org/apache/commons/validator/routines/LongValidator.java
+++ b/src/main/java/org/apache/commons/validator/routines/LongValidator.java
@@ -242,10 +242,11 @@ public class LongValidator extends 
AbstractNumberValidator {
     @Override
     protected Object processParsedValue(Object value, Format formatter) {
 
+        // Parsed value will be Long if it fits in a long and is not fractional
         if (value instanceof Long) {
             return value;
         }
-        return Long.valueOf(((Number)value).longValue());
+        return null;
 
     }
 }
diff --git 
a/src/test/java/org/apache/commons/validator/routines/ByteValidatorTest.java 
b/src/test/java/org/apache/commons/validator/routines/ByteValidatorTest.java
index 7cfdc84..98c2ed0 100644
--- a/src/test/java/org/apache/commons/validator/routines/ByteValidatorTest.java
+++ b/src/test/java/org/apache/commons/validator/routines/ByteValidatorTest.java
@@ -25,6 +25,14 @@ import java.util.Locale;
  */
 public class ByteValidatorTest extends AbstractNumberValidatorTest {
 
+    private static final Byte BYTE_MIN_VAL = Byte.valueOf(Byte.MIN_VALUE);
+    private static final Byte BYTE_MAX_VAL = Byte.valueOf(Byte.MAX_VALUE);
+    private static final String BYTE_MAX   =  "127";
+    private static final String BYTE_MAX_0 =  "127.99999999999999999999999"; 
// force double rounding
+    private static final String BYTE_MAX_1 =  "128";
+    private static final String BYTE_MIN   = "-128";
+    private static final String BYTE_MIN_0 = "-128.99999999999999999999999"; 
// force double rounding";
+    private static final String BYTE_MIN_1 = "-129";
     /**
      * Constructor
      * @param name test name
@@ -49,18 +57,18 @@ public class ByteValidatorTest extends 
AbstractNumberValidatorTest {
         minMinusOne = Long.valueOf(min.longValue() - 1);
 
         // testInvalidStrict()
-        invalidStrict = new String[] {null, "", "X", "X12", "12X", "1X2", 
"1.2"};
+        invalidStrict = new String[] {null, "", "X", "X12", "12X", "1X2", 
"1.2", BYTE_MAX_1, BYTE_MIN_1, BYTE_MAX_0, BYTE_MIN_0};
 
         // testInvalidNotStrict()
-        invalid       = new String[] {null, "", "X", "X12"};
+        invalid       = new String[] {null, "", "X", "X12", BYTE_MAX_1, 
BYTE_MIN_1};
 
         // testValid()
         testNumber    = Byte.valueOf((byte)123);
         testZero      = Byte.valueOf((byte)0);
-        validStrict          = new String[] {"0", "123", ",123"};
-        validStrictCompare   = new Number[] {testZero, testNumber, testNumber};
-        valid                = new String[] {"0", "123", ",123", ",123.5", 
"123X"};
-        validCompare         = new Number[] {testZero, testNumber, testNumber, 
testNumber, testNumber};
+        validStrict          = new String[] {"0", "123", ",123", BYTE_MAX, 
BYTE_MIN};
+        validStrictCompare   = new Number[] {testZero, testNumber, testNumber, 
BYTE_MAX_VAL, BYTE_MIN_VAL};
+        valid                = new String[] {"0", "123", ",123", ",123.5", 
"123X", BYTE_MAX, BYTE_MIN, BYTE_MAX_0, BYTE_MIN_0};
+        validCompare         = new Number[] {testZero, testNumber, testNumber, 
testNumber, testNumber, BYTE_MAX_VAL, BYTE_MIN_VAL, BYTE_MAX_VAL, BYTE_MIN_VAL};
 
         testStringUS = ",123";
         testStringDE = ".123";
diff --git 
a/src/test/java/org/apache/commons/validator/routines/IntegerValidatorTest.java 
b/src/test/java/org/apache/commons/validator/routines/IntegerValidatorTest.java
index 2a56be8..110ac47 100644
--- 
a/src/test/java/org/apache/commons/validator/routines/IntegerValidatorTest.java
+++ 
b/src/test/java/org/apache/commons/validator/routines/IntegerValidatorTest.java
@@ -25,6 +25,15 @@ import java.util.Locale;
  */
 public class IntegerValidatorTest extends AbstractNumberValidatorTest {
 
+    private static final Integer INT_MIN_VAL = 
Integer.valueOf(Integer.MIN_VALUE);
+    private static final Integer INT_MAX_VAL = 
Integer.valueOf(Integer.MAX_VALUE);
+    private static final String INT_MAX   =  "2147483647";
+    private static final String INT_MAX_0 =  
"2147483647.99999999999999999999999"; // force double rounding
+    private static final String INT_MAX_1 =  "2147483648";
+    private static final String INT_MIN   = "-2147483648";
+    private static final String INT_MIN_0 = 
"-2147483648.99999999999999999999999"; // force double rounding";
+    private static final String INT_MIN_1 = "-2147483649";
+
     /**
      * Constructor
      * @param name test name
@@ -49,18 +58,18 @@ public class IntegerValidatorTest extends 
AbstractNumberValidatorTest {
         minMinusOne = Long.valueOf(min.longValue() - 1);
 
         // testInvalidStrict()
-        invalidStrict = new String[] {null, "", "X", "X12", "12X", "1X2", 
"1.2"};
+        invalidStrict = new String[] {null, "", "X", "X12", "12X", "1X2", 
"1.2", INT_MAX_1, INT_MIN_1};
 
         // testInvalidNotStrict()
-        invalid       = new String[] {null, "", "X", "X12"};
+        invalid       = new String[] {null, "", "X", "X12", INT_MAX_1, 
INT_MIN_1};
 
         // testValid()
         testNumber    = Integer.valueOf(1234);
         testZero      = Integer.valueOf(0);
-        validStrict          = new String[] {"0", "1234", "1,234"};
-        validStrictCompare   = new Number[] {testZero, testNumber, testNumber};
-        valid                = new String[] {"0", "1234", "1,234", "1,234.5", 
"1234X"};
-        validCompare         = new Number[] {testZero, testNumber, testNumber, 
testNumber, testNumber};
+        validStrict          = new String[] {"0", "1234", "1,234", INT_MAX, 
INT_MIN};
+        validStrictCompare   = new Number[] {testZero, testNumber, testNumber, 
INT_MAX_VAL, INT_MIN_VAL};
+        valid                = new String[] {"0", "1234", "1,234", "1,234.5", 
"1234X", INT_MAX, INT_MIN, INT_MAX_0, INT_MIN_0};
+        validCompare         = new Number[] {testZero, testNumber, testNumber, 
testNumber, testNumber, INT_MAX_VAL, INT_MIN_VAL, INT_MAX_VAL, INT_MIN_VAL};
 
         testStringUS = "1,234";
         testStringDE = "1.234";
diff --git 
a/src/test/java/org/apache/commons/validator/routines/LongValidatorTest.java 
b/src/test/java/org/apache/commons/validator/routines/LongValidatorTest.java
index 68114ae..3b8fe08 100644
--- a/src/test/java/org/apache/commons/validator/routines/LongValidatorTest.java
+++ b/src/test/java/org/apache/commons/validator/routines/LongValidatorTest.java
@@ -25,6 +25,16 @@ import java.util.Locale;
  */
 public class LongValidatorTest extends AbstractNumberValidatorTest {
 
+    private static final Long LONG_MIN_VAL = Long.valueOf(Long.MIN_VALUE);
+    private static final Long LONG_MAX_VAL = Long.valueOf(Long.MAX_VALUE);
+    private static final String LONG_MAX   =  "9223372036854775807";
+    private static final String LONG_MAX_0 =  
"9223372036854775807.99999999999999999999999"; // force double rounding
+    private static final String LONG_MAX_1 =  "9223372036854775808";
+    private static final String LONG_MIN   = "-9223372036854775808";
+    private static final String LONG_MIN_0 = 
"-9223372036854775808.99999999999999999999999"; // force double rounding
+    private static final String LONG_MIN_1 = "-9223372036854775809";
+
+    private static final String NINES = 
"9999999999999999999999999999999999999";
     /**
      * Constructor
      * @param name test name
@@ -48,19 +58,20 @@ public class LongValidatorTest extends 
AbstractNumberValidatorTest {
         min = null;
         minMinusOne = null;
 
+        
         // testInvalidStrict()
-        invalidStrict = new String[] {null, "", "X", "X12", "12X", "1X2", 
"1.2"};
+        invalidStrict = new String[] {null, "", "X", "X12", "12X", "1X2", 
"1.2", LONG_MAX_1, LONG_MIN_1, NINES};
 
         // testInvalidNotStrict()
-        invalid       = new String[] {null, "", "X", "X12"};
+        invalid       = new String[] {null, "", "X", "X12", "", LONG_MAX_1, 
LONG_MIN_1, NINES};
 
         // testValid()
         testNumber    = Long.valueOf(1234);
         testZero      = Long.valueOf(0);
-        validStrict          = new String[] {"0", "1234", "1,234"};
-        validStrictCompare   = new Number[] {testZero, testNumber, testNumber};
-        valid                = new String[] {"0", "1234", "1,234", "1,234.5", 
"1234X"};
-        validCompare         = new Number[] {testZero, testNumber, testNumber, 
testNumber, testNumber};
+        validStrict          = new String[] {"0", "1234", "1,234", LONG_MAX, 
LONG_MIN};
+        validStrictCompare   = new Number[] {testZero, testNumber, testNumber, 
LONG_MAX_VAL, LONG_MIN_VAL};
+        valid                = new String[] {"0", "1234", "1,234", "1,234.5", 
"1234X", LONG_MAX, LONG_MIN, LONG_MAX_0, LONG_MIN_0};
+        validCompare         = new Number[] {testZero, testNumber, testNumber, 
testNumber, testNumber, LONG_MAX_VAL, LONG_MIN_VAL, LONG_MAX_VAL, LONG_MIN_VAL};
 
         testStringUS = "1,234";
         testStringDE = "1.234";

Reply via email to