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

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


The following commit(s) were added to refs/heads/master by this push:
     new bdff802a8 [LANG-1729] NumberUtils.isParsable() returns true for 
Fullwidth Unicode digits
bdff802a8 is described below

commit bdff802a85306ac8246a80876c0a44baec57ff10
Author: Gary Gregory <[email protected]>
AuthorDate: Wed Apr 24 16:51:21 2024 -0400

    [LANG-1729] NumberUtils.isParsable() returns true for Fullwidth Unicode
    digits
    
    Refactor tests
---
 .../apache/commons/lang3/math/NumberUtilsTest.java | 122 ++++++++++++++-------
 1 file changed, 80 insertions(+), 42 deletions(-)

diff --git a/src/test/java/org/apache/commons/lang3/math/NumberUtilsTest.java 
b/src/test/java/org/apache/commons/lang3/math/NumberUtilsTest.java
index 912109690..29404044d 100644
--- a/src/test/java/org/apache/commons/lang3/math/NumberUtilsTest.java
+++ b/src/test/java/org/apache/commons/lang3/math/NumberUtilsTest.java
@@ -30,6 +30,7 @@ import java.math.BigInteger;
 import java.math.RoundingMode;
 import java.text.NumberFormat;
 import java.text.ParseException;
+import java.util.function.Function;
 
 import org.apache.commons.lang3.AbstractLangTest;
 import org.junit.jupiter.api.Test;
@@ -97,68 +98,87 @@ public class NumberUtilsTest extends AbstractLangTest {
         assertTrue(NumberUtils.compare((short) 213, (short) 32) > 0);
     }
 
-    private boolean isParsableByte(final String s) {
-        final NumberFormat instance = NumberFormat.getInstance();
-        instance.setParseIntegerOnly(false);
-        try {
-            instance.parse(s);
-        } catch (final ParseException e) {
-            return false;
-        }
+    private boolean isApplyNonNull(final String s, final Function<String, ?> 
function) {
         try {
-            Byte.parseByte(s);
-        } catch (final NumberFormatException e) {
+            assertNotNull(function.apply(s));
+            return true;
+        } catch (final Exception e) {
+            if (!s.matches(".*\\s.*")) {
+                e.printStackTrace();
+            }
             return false;
         }
-        return NumberUtils.isParsable(s);
     }
 
-    private boolean isParsableInteger(final String s) {
+    private boolean isNumberFormatParsable(final String s) {
         final NumberFormat instance = NumberFormat.getInstance();
-        instance.setParseIntegerOnly(false);
         try {
-            instance.parse(s);
+            // Stops parsing when a space is found, then returns an object.
+            assertNotNull(instance.parse(s));
+            return true;
         } catch (final ParseException e) {
             return false;
         }
-        try {
-            Integer.parseInt(s);
-        } catch (final NumberFormatException e) {
-            return false;
-        }
-        return NumberUtils.isParsable(s);
     }
 
-    private boolean isParsableLong(final String s) {
+    private boolean isNumberIntegerOnlyFormatParsable(final String s) {
         final NumberFormat instance = NumberFormat.getInstance();
-        instance.setParseIntegerOnly(false);
+        instance.setParseIntegerOnly(true);
         try {
-            instance.parse(s);
+            // Stops parsing when a space is found, then returns an object.
+            assertNotNull(instance.parse(s));
+            return true;
         } catch (final ParseException e) {
             return false;
         }
-        try {
-            Long.parseLong(s);
-        } catch (final NumberFormatException e) {
-            return false;
-        }
-        return NumberUtils.isParsable(s);
+    }
+
+    private boolean isParsableByte(final String s) {
+        final boolean parsable = NumberUtils.isParsable(s);
+        assertTrue(isNumberFormatParsable(s), s);
+        assertTrue(isNumberIntegerOnlyFormatParsable(s), s);
+        assertEquals(parsable, isApplyNonNull(s, Byte::parseByte), s);
+        return parsable;
+    }
+
+    private boolean isParsableFloat(final String s) {
+        final boolean parsable = NumberUtils.isParsable(s);
+        assertTrue(isNumberFormatParsable(s), s);
+        assertTrue(isNumberIntegerOnlyFormatParsable(s), s);
+        assertEquals(parsable, isApplyNonNull(s, Float::parseFloat), s);
+        return parsable;
+    }
+
+    private boolean isParsableDouble(final String s) {
+        final boolean parsable = NumberUtils.isParsable(s);
+        assertTrue(isNumberFormatParsable(s), s);
+        assertTrue(isNumberIntegerOnlyFormatParsable(s), s);
+        assertEquals(parsable, isApplyNonNull(s, Double::parseDouble), s);
+        return parsable;
+    }
+
+    private boolean isParsableInteger(final String s) {
+        final boolean parsable = NumberUtils.isParsable(s);
+        assertTrue(isNumberFormatParsable(s), s);
+        assertTrue(isNumberIntegerOnlyFormatParsable(s), s);
+        assertEquals(parsable, isApplyNonNull(s, Integer::parseInt), s);
+        return parsable;
+    }
+
+    private boolean isParsableLong(final String s) {
+        final boolean parsable = NumberUtils.isParsable(s);
+        assertTrue(isNumberFormatParsable(s), s);
+        assertTrue(isNumberIntegerOnlyFormatParsable(s), s);
+        assertEquals(parsable, isApplyNonNull(s, Long::parseLong), s);
+        return parsable;
     }
 
     private boolean isParsableShort(final String s) {
-        final NumberFormat instance = NumberFormat.getInstance();
-        instance.setParseIntegerOnly(false);
-        try {
-            instance.parse(s);
-        } catch (final ParseException e) {
-            return false;
-        }
-        try {
-            Short.parseShort(s);
-        } catch (final NumberFormatException e) {
-            return false;
-        }
-        return NumberUtils.isParsable(s);
+        final boolean parsable = NumberUtils.isParsable(s);
+        assertTrue(isNumberFormatParsable(s), s);
+        assertTrue(isNumberIntegerOnlyFormatParsable(s), s);
+        assertEquals(parsable, isApplyNonNull(s, Short::parseShort), s);
+        return parsable;
     }
 
     /**
@@ -1031,6 +1051,24 @@ public class NumberUtilsTest extends AbstractLangTest {
         assertFalse(isParsableByte("1 2 3"));
     }
 
+    @Test
+    public void testLang1729IsParsableDouble() {
+        assertTrue(isParsableDouble("1"));
+        assertFalse(isParsableDouble("1 2 3"));
+        // TODO Expected to be fixed in Java 23
+        // assertTrue(isParsableDouble("123"));
+        assertFalse(isParsableDouble("1 2 3"));
+    }
+
+    @Test
+    public void testLang1729IsParsableFloat() {
+        assertTrue(isParsableFloat("1"));
+        assertFalse(isParsableFloat("1 2 3"));
+        // TODO Expected to be fixed in Java 23
+        // assertTrue(isParsableFloat("123"));
+        assertFalse(isParsableFloat("1 2 3"));
+    }
+
     @Test
     public void testLang1729IsParsableInteger() {
         assertTrue(isParsableInteger("1"));

Reply via email to